1 setColorFilter(ColorFilter colorFilter)
ColorFilter
这个类,它的名字已经足够解释它的作用:为绘制设置颜色过滤。颜色过滤的意思,就是为绘制的内容设置一个统一的过滤策略,然后 Canvas.drawXXX()
方法会对每个像素都进行过滤后再绘制出来,等会画出来就自然明白了。
这是在 Paint
里设置 ColorFilter
,使用的是 Paint.setColorFilter(ColorFilter filter)
方法。 ColorFilter
并不直接使用,而是使用它的子类。它共有三个子类:LightingColorFilter
PorterDuffColorFilter
和 ColorMatrixColorFilter
。
1.1 LightingColorFilter
顾名思义,这个 LightingColorFilter
是用来模拟简单的光照效果的。
LightingColorFilter
的构造方法是 LightingColorFilter(int mul, int add)
,参数里的 mul
和 add
都是和颜色值格式相同的 int 值,其中 mul
用来和目标像素相乘,add
用来和目标像素相加:
R' = R * mul.R / 0xff + add.R
G' = G * mul.G / 0xff + add.G
B' = B * mul.B / 0xff + add.B
一个「保持原样」的「基本 LightingColorFilter
」,mul
为 0xffffff
,add
为 0x000000
(也就是0),那么对于一个像素,它的计算过程就是:
R' = R * 0xff / 0xff + 0x0 = R // R' = R
G' = G * 0xff / 0xff + 0x0 = G // G' = G
B' = B * 0xff / 0xff + 0x0 = B // B' = B
基于这个「基本 LightingColorFilter
」,你就可以修改一下做出其他的 filter。比如,如果你想去掉原像素中的红色,可以把它的 mul
改为 0x00ffff
(红色部分为 0 ) ,那么它的计算过程就是:
R' = R * 0x0 / 0xff + 0x0 = 0 // 红色被移除
G' = G * 0xff / 0xff + 0x0 = G
B' = B * 0xff / 0xff + 0x0 = B
具体效果是这样的:
或者,如果你想让它的绿色更亮一些,就可以把它的 add
改为 0x003000
(绿色部分为 0x30 ),那么它的计算过程就是:
R' = R * 0xff / 0xff + 0x0 = R
G' = G * 0xff / 0xff + 0x30 = G + 0x30 // 绿色被加强
B' = B * 0xff / 0xff + 0x0 = B
效果是这样:
emmm我这只鸡本来就长得比较绿
至于怎么修改参数来模拟你想要的某种具体光照效果,就可以发挥自己的想象力了。
1.2 PorterDuffColorFilter
这个 PorterDuffColorFilter
的作用是使用一个指定的颜色和一种指定的 PorterDuff.Mode
来与绘制对象进行合成。它的构造方法是 PorterDuffColorFilter(int color, PorterDuff.Mode mode)
其中的 color
参数是指定的颜色, mode
参数是指定的 Mode
。同样也是 PorterDuff.Mode
,不过和 ComposeShader
不同的是,PorterDuffColorFilter
作为一个 ColorFilter
,只能指定一种颜色作为源,而不是一个 Bitmap
。
PorterDuff.Mode
前面已经讲过了,而 PorterDuffColorFilter
本身的使用是非常简单的,那这里就不再展开来讲了。
1.3 ColorMatrixColorFilter
ColorMatrixColorFilter
使用一个 ColorMatrix
来对颜色进行处理。 ColorMatrix
这个类,内部是一个 4x5 的矩阵,所以,这是个大家伙,我们一起来看看:
[ a, b, c, d, e,
f , g, h, i , j ,
k, l, m, n, o,
p, q, r, s, t ]
通过计算, ColorMatrix
可以把要绘制的像素进行转换。对于颜色 [R, G, B, A] ,转换算法是这样的:
R’ = a*R + b*G + c*B + d*A + e;
G’ = f*R + g*G + h*B + i*A + j;
B’ = k*R + l*G + m*B + n*A + o;
A’ = p*R + q*G + r*B + s*A + t;
ColorMatrix
有一些自带的方法可以做简单的转换,例如可以使用 setSaturation(float sat)
来设置饱和度;另外你也可以自己去设置它的每一个元素来对转换效果做精细调整。具体怎样设置会有怎样的效果,就看自己的造化了。
以上,就是 Paint
对颜色的第二层处理:通过 setColorFilter(colorFilter)
来加工颜色。
除了基本颜色的设置( setColor/ARGB()
, setShader()
)以及基于原始颜色的过滤( setColorFilter()
)之外,Paint
最后一层处理颜色的方法是 setXfermode(Xfermode xfermode)
,它处理的是「当颜色遇上 View」的问题,这部分内容就留到下一篇文章写。希望大家越来越好!