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));

  

  

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

posted @ 2015-08-28 14:28  轻云沉峰  阅读(782)  评论(0)    收藏  举报