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) {
}
運行效果如下所示: