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