Android提供了强大的颜色过滤器来进行颜色处理,ColorMetrixColorFilter通过一个4*5的矩阵来创建颜色过滤器,从而改变图片的信息。
{1,0,0,0,0, //red 1*R + 0*G + 0*B + 0*A + 0
0,1,0,0,0, //green 0*R + 1*G + 0*B + 0*A + 0
0,0,1,0,0, //blue 0*R + 0*G + 1*B + 0*A + 0
0,0,0,1,0 } //alpha 0*R + 0*G + 0*B + 1*A + 0
颜色矩阵的每一行的最后一个值更改时,其对于的颜色就会发生改变。因此更改颜色只需修改对应颜色矩阵的最后一个值,最大范围是255.
下面是一个简单的示例:
布局文件是一个垂直的LinerLayout加了四个水平的LinerLayout,此处省略。
java文件如下:
public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {
private ImageView imageView;
private String name = "example.jpg";
private SeekBar sbRed;
private SeekBar sbGreen;
private SeekBar sbBlue;
private SeekBar sbRgb;
private float [] arrays = new float[]{
1,0,0,0,0,
0,1,0,0,0,
0,0,1,0,0,
0,0,0,1,0
};
private ColorFilter colorFilter = new ColorMatrixColorFilter(arrays); //申明颜色过滤器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
sbRed = findViewById(R.id.sb_red);
sbGreen = findViewById(R.id.sb_green);
sbBlue = findViewById(R.id.sb_blue);
sbRgb = findViewById(R.id.sb_rgb);
sbRed.setOnSeekBarChangeListener(this);
sbGreen.setOnSeekBarChangeListener(this);
sbBlue.setOnSeekBarChangeListener(this);
sbRed.setOnSeekBarChangeListener(this);
}
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
int id = seekBar.getId();
switch (id){
case R.id.sb_red:
arrays[4]= i;
break;
case R.id.sb_green:
arrays[9] = i;
break;
case R.id.sb_blue:
arrays[14] = i;
break;
case R.id.sb_rgb:
arrays[4]=arrays[9]=arrays[14]=i;
break;
default:
break;
}
colorFilter = new ColorMatrixColorFilter(arrays);
imageView.setColorFilter(colorFilter);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
运行效果如下所示: