天天看点

自定义View——颜色过滤setColorFilter

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 

具体效果是这样的:

自定义View——颜色过滤setColorFilter

 或者,如果你想让它的绿色更亮一些,就可以把它的 

add

 改为 

0x003000

 (绿色部分为 0x30 ),那么它的计算过程就是: 

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

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

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

效果是这样:

自定义View——颜色过滤setColorFilter
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」的问题,这部分内容就留到下一篇文章写。希望大家越来越好!