天天看點

自定義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」的問題,這部分内容就留到下一篇文章寫。希望大家越來越好!