用属性动画ValueAnimator实现图片处理
前言
Matrix函数,顾名思义是利用矩阵,利用矩阵对图片的色彩进行处理。
setSaturation()函数——设置饱和度
-
如图一所示; 布局为 ImageView 和 SeekBar;方法如下:
//同时增强 R G B 的色彩饱和度 public void setSaturation(float sat);
参数
sat
表示当前色彩饱和度放大的倍数;- 取值为 0 表示灰度图像,黑白色;
- 取值为1 即为原图;
- 取值越大,色彩饱和度越高;
-
核心代码如下:
public class ColorMatrixActivity extends AppCompatActivity { private Bitmap originBitmap, tempBitmap; private ImageView iv_color_saturation; private TextView tv_saturation; private SeekBar sb_color_matrix; private void initView() { //初始化控件,切记一定要初始化 imageView!一定要初始化 imageView!一定要初始化 imageView! …… //调用函数 改变色彩饱和度;0 - 黑白;1 - 原图;max - 色彩鲜明; originBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.advance_forest); tempBitmap = Bitmap.createBitmap(originBitmap.getWidth(), originBitmap.getHeight(), Bitmap.Config.ARGB_8888); sb_color_matrix.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { saturation = progress; //不能直接设置 progress,要转换成 String tv_saturation.setText(String.valueOf(progress)); Bitmap bitmap = handleColorMatrixBmp(progress, redScale, greenScale, blueScale, rotateAxis, 1); iv_color_saturation.setImageBitmap(bitmap); } …… }); } /** * 设置饱和度 & 处理图片 色彩等信息;二选一, * * @param saturation 饱和度 * @param red 红色 缩放 * @param green 红色 缩放 * @param blue 红色 缩放 * @param rotateAxis 绕哪个轴旋转 0 - Red;1 - Green;2 - Blue * @param i 0 - 改变图片饱和度;1 - 进行色彩缩放;2 - 色彩旋转 * @return */ private Bitmap handleColorMatrixBmp(int saturation, float red, float green, float blue, int rotateAxis, int i) { // 创建一个相同尺寸的可变的位图区,用于绘制调色后的图片 - 饱和度 Canvas canvas = new Canvas(tempBitmap); Paint paint = new Paint(); ColorMatrix mColorMatrix = new ColorMatrix(); if (i == 1) { //设置饱和度 mColorMatrix.setSaturation(saturation); } paint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix)); //将色彩变换后的图片输出到新创建的位图区 canvas.drawBitmap(originBitmap, 0, 0, paint); return tempBitmap; } }
setScale()函数——实现色彩缩放
-
如图二所示,实现 R G B 三色的色彩缩放,方法如下:
public void setScale(float rScale, float gScale, float bScale,float aScale);
参数:分别对应R、G、B、A 颜色值的缩放倍数。
-
核心代码如下:
private void initView() { …… sb_red_matrix.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { //不能直接设置 progress,要转换成 String redScale = progress / 10f; tv_red.setText(String.valueOf(redScale)); Bitmap bitmap = handleColorMatrixBmp(saturation, redScale, greenScale, blueScale, rotateAxis, 2); iv_color_saturation.setImageBitmap(bitmap); } …… } mColorMatrix.setScale(red, green, blue, 1); } private Bitmap handleColorMatrixBmp(int saturation, float red, float green, float blue, int rotateAxis, int i) { // 创建一个相同尺寸的可变的位图区,用于绘制调色后的图片 - 饱和度 Canvas canvas = new Canvas(tempBitmap); Paint paint = new Paint(); ColorMatrix mColorMatrix = new ColorMatrix(); if (i == 2) { //生成色彩变化矩阵, mColorMatrix.setScale(red, green, blue, 1); } paint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix)); //将色彩变换后的图片输出到新创建的位图区 canvas.drawBitmap(originBitmap, 0, 0, paint); return tempBitmap; }
setRotate()函数——实现色彩旋转
-
如图三所示;方法如下:
public void setRotate(int axis, float degrees);
参数:将旋转围绕某一个颜色轴进行;
- axis=0 围绕红色轴旋转;
- axis=1 围绕绿色轴旋转;
- axis=2 围绕蓝色轴旋转;
- degrees 即旋转角度,0 - 360 ;
-
核心代码如下:
private void initView() {
……
sb_red_rot.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
rotate = progress;
//不能直接设置 progress,要转换成 String
tv_red_rot.setText(String.valueOf(rotate));
rotateAxis = 0;
Bitmap bitmap = handleColorMatrixBmp(saturation, redScale, greenScale, blueScale, rotateAxis, 3);
iv_color_saturation.setImageBitmap(bitmap);
}
……
}
}
private Bitmap handleColorMatrixBmp(int saturation, float red, float green, float blue, int rotateAxis, int i) {
// 创建一个相同尺寸的可变的位图区,用于绘制调色后的图片 - 饱和度
Canvas canvas = new Canvas(tempBitmap);
Paint paint = new Paint();
ColorMatrix mColorMatrix = new ColorMatrix();
if (i == 3) {
/**
* 如果 依次 设置setRotate 那就会使前面的失效,只有最后一个有效;待办事项:能叠加吗?
*/
mColorMatrix.setRotate(rotateAxis, rotate - 180);
}
paint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
//将色彩变换后的图片输出到新创建的位图区
canvas.drawBitmap(originBitmap, 0, 0, paint);
return tempBitmap;
}
声明:本文整理自《启舰_自定义控件》如有侵权请联系我。