Paint颜色过滤
参考资料:http://blog.csdn.net/aigestudio/article/details/41316141
补充:onDraw中需要不断重绘调用invalidate()方法,如果在非UI线程中用Handler就比较麻烦了,系统提供了postInvalidate()方法可直接使用
Paint画笔提供了颜色过滤的功能设置,可以过滤图像颜色。使用方法:setColorFilter(ColorFilter filter)
颜色过滤有三个子类,提供了三种方法
1、ColorMatrixColorFilter
色彩矩阵颜色过滤器,通过原有颜色进行矩阵运算得到新的颜色。矩阵的计算方式如图

矩阵的取值范围0f~2f,通过不同矩阵运算可以得出不同的图像颜色效果,下面先绘制原图
public class CustomView extends View{
private Paint mPaint;
private Bitmap bitmap;
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
initRes();
}
private void initRes() {
bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.s);
}
private void initPaint() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(bitmap, 0, 0, mPaint);
}
}

添加灰色颜色过滤
ColorMatrix colorMatrix = new ColorMatrix(new float[]{
0.5F, 0, 0, 0, 0,
0, 0.5F, 0, 0, 0,
0, 0, 0.5F, 0, 0,
0, 0, 0, 1, 0,
});
mPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));

老照片效果
ColorMatrix colorMatrix = new ColorMatrix(new float[]{
0.393F, 0.769F, 0.189F, 0, 0,
0.349F, 0.686F, 0.168F, 0, 0,
0.272F, 0.534F, 0.131F, 0, 0,
0, 0, 0, 1, 0,
});
mPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));

2、LightingColorFilter
光照颜色过滤,通过模拟光线照射反射颜色
LightingColorFilter(int mul, int add),参数意思色彩倍增,色彩添加
LightingColorFilter(0xFFFFFFFF, 0x00000000),则原图不变。分析:给足了ARGB的光线,无色彩添加
那么如果需要去掉绿色写法就是:LightingColorFilter(0xFFFF00FF, 0x00000000)
继续使用上图,比如去除蓝色
mPaint.setColorFilter(new LightingColorFilter(0xFFFFFF00, 0x00000000));

点击后色彩添加的效果
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
initRes();
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/*
* 判断控件是否被点击过
*/
if (isClick) {
mPaint.setColorFilter(null);
isClick = false;
} else {
mPaint.setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0X00FF0000));
isClick = true;
}
// 重绘
invalidate();
}
});
}

3、PorterDuffColorFilter
PorterDuffColorFilter(int color, PorterDuff.Mode mode)
混合模式颜色过滤,这里是颜色过滤器也就是颜色与图像的混合,称为色彩混合,后面还将介绍到图形的混合
模式比如:PorterDuff.Mode.DARKEN变暗,如果在色彩混合中使用了图形混合模式将看不到任何效果
mPaint.setColorFilter(new PorterDuffColorFilter(0xFF45A8C1, PorterDuff.Mode.DARKEN));

总结:画笔的颜色过滤器有三种方法:矩阵颜色计算、光照颜色过滤、颜色混合模式,颜色过滤器中支持颜色混合模式,后面的过渡模式中将会继续使用图形混合模式
浙公网安备 33010602011771号