1 setColorFilter(ColorFilter colorFilter)

ColorFilter 这个类,它的名字已经足够解释它的作用:为绘制设置颜色过滤。颜色过滤的意思,就是为绘制的内容设置一个统一的过滤策略,然后 Canvas.drawXXX() 方法会对每个像素都进行过滤后再绘制出来,等会画出来就自然明白了。

这是在 Paint 里设置 ColorFilter ,使用的是 Paint.setColorFilter(ColorFilter filter) 方法。 ColorFilter 并不直接使用,而是使用它的子类。它共有三个子类:LightingColorFilter PorterDuffColorFilterColorMatrixColorFilter

1.1 LightingColorFilter

顾名思义,这个 LightingColorFilter 是用来模拟简单的光照效果的。

LightingColorFilter 的构造方法是 LightingColorFilter(int mul, int add) ,参数里的 muladd 都是和颜色值格式相同的 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 为 0xffffffadd 为 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 

具体效果是这样的:

android recyclerview overscroll 颜色 android setcolorfilter_xml

 或者,如果你想让它的绿色更亮一些,就可以把它的 add 改为 0x003000 (绿色部分为 0x30 ),那么它的计算过程就是: 

R' = R * 0xff / 0xff + 0x0 = R

G' = G * 0xff / 0xff + 0x30 = G + 0x30 // 绿色被加强

B' = B * 0xff / 0xff + 0x0 = B

效果是这样:

android recyclerview overscroll 颜色 android setcolorfilter_xml_02

 

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」的问题,这部分内容就留到下一篇文章写。希望大家越来越好!