Android Paint关于ColorFilter

前言

之前说过Paint除了通过setColor()/setARGB()/setAlpha()等方法设置paint的颜色外,还可以通过设置滤镜ColorFilter来改变绘制出来的颜色。ColorFilter对应以下三个子类。

  • LightingColorFilter
  • PortDuffColorFilter
  • ColorMatrixColorFilter

其实它们只是计算的方式不一样,如果你没有UI设计的天赋,那还是像我一样掌握它是如何计算好了,至于美感还是交给UI吧。

LightingColorFilter

先来看看这个ColorFilter的构造器,它接受两个参数,一个是mul,一个是add

LightingColorFilter(int mul, int add)

比如你现在设置paint的color是#1b8fe6,然后通过滤镜后想要让其颜色不变,那么可以设置mul为0xffffff,add为0x000000。其实这个玩意是这样去计算的,我们记paint设置的颜色中三原色的值为R,G,B,mul中的三原色的值为mul.R,mul.G,mul.B,add中的三原色的值为add.R,add.G,add.B,那么最终的三原色为

经过滤镜后的R = R * mul.R / 0xff + add.R
经过滤镜后的G = G * mul.G / 0xff + add.G
经过滤镜后的B = B * mul.B / 0xff + add.B

举个例子,先容我反手甩出一段代码

    protected void onDraw(Canvas canvas) {

        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setStrokeWidth(20);
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.parseColor("#ffffff"));

        LightingColorFilter filter = new LightingColorFilter(0x000000, 0x1b8fe6);
        paint.setColorFilter(filter);

        canvas.drawColor(Color.parseColor("#000000"));

        canvas.drawCircle(200, 200, 100, paint);

    }

如果不设置滤镜,那么绘制出来的应该是黑色的底色,白色的圆,如下

Android Paint关于ColorFilter_第1张图片
没有滤镜.png

现在设置滤镜后,根据计算方式,可以得到R = 0xff * 0x00 / 0xff + 0x1b = 0x1b,G = 0xff * 0x00 / 0xff + 0x8f = 0x8f,B = 0xff * 0x00 / 0xff + 0xe6 = 0xe6,所以最终绘制出来的颜色应该是0x1b8fe6,效果图如下。

Android Paint关于ColorFilter_第2张图片
有滤镜.png

然而并没有什么卵用,你TM在逗我?直接设置

paint.setColor(Color.parseColor("#1b8fe6"));

不就好了吗,加个锤子的滤镜。嗯,我也觉得没有卵用,你知道有这么个东西,并且知道怎么算的就好了。

PorterDuffColorFilter

又见到这个PorterDuff了,如果不知道PorterDuff.Mode的结合方式的,可以先看看之前写的这篇文章PorterDuff.Mode,就是给一个颜色,然后执行指定的结合方式,嗯,精辟!!不多说了,下一个。

ColorMatrixColorFilter

先来看看这个类的构造器

    public ColorMatrixColorFilter(float[] array) {
        if (array.length < 20) {
            throw new ArrayIndexOutOfBoundsException();
        }
        mMatrix.set(array);
        update();
    }

它接收一个长度大于20的float数组。实际上它会将前20个元素作为一个45的矩阵*。

r1,g1,b1,a1,e1,
r2,g2,b2,a2,e2,
r3,g3,b3,a3,e3,
r4,g4,b4,a4,e4......
比如我们指定如上的一个4*5的矩阵(就是float数组的前20个元素),
同样我们记paint设置的三原色分别为R,G,B,透明度为A。
则经过ColorMatrixColorFilter之后,会得到这一样一个值
r1 * R + g1 * G + b1 * B + a1 * A + e1 = R'
r2 * R + g2 * G + b2 * B + a2 * A + e2 = G'
r3 * R + g3 * G + b3 * B + a3 * A + e3 = B'
r4 * R + g4 * G + b4 * B + a4 * A + e4 = A'

举个例子,容我反手甩出一段代码

   protected void onDraw(Canvas canvas) {

        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setStrokeWidth(20);
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.parseColor("#000000"));

        float[] array = new float[]{
                1, 0, 0, 0, 0xff,
                0, 1, 0, 0, 0,
                0, 0, 1, 0, 0,
                0, 0, 0, 1, 0
        };

        ColorMatrixColorFilter filter = new ColorMatrixColorFilter(array);
        paint.setColorFilter(filter);

        canvas.drawColor(Color.parseColor("#000000"));

        canvas.drawCircle(200, 200, 100, paint);

    }

如果不设置滤镜,那么绘制出来的是一片黑色。但是设置滤镜后,根据之前的计算方式,得到的值应该是0xff0000,也就是最终的结果是红色。

Android Paint关于ColorFilter_第3张图片
ColorMatrixColorFilter.png

你可能感兴趣的:(Android Paint关于ColorFilter)