顏色相關(guān):color、shader、colorFilter、Xfermode
1.直接設(shè)置顏色
setColor(int color)
setARGB(int a, int r, int g, int b)參數(shù)為透明度及三原色
2.設(shè)置著色器
著色器:圖形領(lǐng)域里一個(gè)通用的概念,是一種顏色方案或著色規(guī)則。
setShader(Shader shader)
Shader.TileMode:端點(diǎn)范圍之外的著色規(guī)則
CLAMP:在端點(diǎn)之外延續(xù)端點(diǎn)處的顏色(即超出邊緣使用邊緣處顏色)
MIRROR:鏡像模式
REPEAT:重復(fù)模式

LinearGradient 線性漸變
簡(jiǎn)介:設(shè)置兩個(gè)點(diǎn)作為端點(diǎn),使用兩個(gè)或一組顏色實(shí)現(xiàn)顏色的漸變效果。
構(gòu)造:LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)?。
? ? ? ? ? ?LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile);
參數(shù):x0?y0?x1?y1:漸變的兩個(gè)端點(diǎn)的位置?
? ? ? ? ? ?color0,color1,int[] colors:兩個(gè)或一組顏色
? ? ? ? ? ?positions:顏色數(shù)組的相對(duì)位置
? ? ? ? ? ?tile:平鋪方式
RadialGradient 輻射漸變
簡(jiǎn)介:從中心向周圍輻射狀的漸變。
構(gòu)造方法: RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode);
? ? ? ? ? ? ? ? ? ?RadialGradient (float x, float y, float radius, int[] colors, float[] positions, Shader.TileMode tile);
參數(shù):centerX?centerY:輻射中心的坐標(biāo)?
? ? ? ? ???radius:輻射半徑?
? ? ? ? ? ?centerColor,edgeColor,int[] colors:輻射中心、邊緣的顏色或一組顏色
SweepGradient 掃描、梯度漸變
簡(jiǎn)介:以某個(gè)點(diǎn)位中心旋轉(zhuǎn)一周所形成的效果。
構(gòu)造:SweepGradient(float cx, float cy, int color0, int color1)
? ? ? ? ? ?SweepGradient (float cx, float cy, int[] colors, float[] positions);
參數(shù):cx?cy?:掃描的中心
? ? ? ? ? ?color0,color1,colors:起始顏色或顏色數(shù)組
BitmapShader 位圖著色
簡(jiǎn)介:用?Bitmap?的像素來(lái)作為圖形或文字的填充。
構(gòu)造方法: BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
參數(shù): bitmap:用來(lái)做模板的?Bitmap?對(duì)象?
? ? ? ? ? ? tileX:X軸方向上位圖的銜接形式
? ? ? ? ? ? tileY:Y軸方向上位圖的銜接形式
ComposeShader混合著色器
簡(jiǎn)介:著色效果的疊加,比如將BitmapShader與LinearGradient的混合渲染 。
構(gòu)造:ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode);
參數(shù):shaderA,?shaderB:兩個(gè)相繼使用的?Shader?
? ? ? ? ? ?mode:兩個(gè)?Shader?的疊加模式
使用

3.顏色過(guò)濾
簡(jiǎn)介:為繪制的內(nèi)容設(shè)置一個(gè)統(tǒng)一的過(guò)濾策略,然后?Canvas.drawXXX()?方法會(huì)對(duì)每個(gè)像素都進(jìn)行過(guò)濾后再繪制出來(lái)。
setColorFilter(ColorFilter colorFilter)
顏色相關(guān)知識(shí)
光的三原色:紅、綠、藍(lán)(三色相加是白色,所以是加色模式,即黑色環(huán)境中用光后環(huán)境變亮)
色(顏料)的三原色:紅、黃、藍(lán)(三色相加是黑色,所以是減色模式,即在白色材料上使用顏料后讓它變暗了)
RGBA模型:R(Red紅色),G(Green綠色),B(Blue藍(lán)色),A(Alpha透明度)
色調(diào)(色相/顏色):物體的顏色
飽和度(彩度):色彩的鮮艷度。顏色的純度:0(灰)~100%(飽和)
亮度(明度):眼睛對(duì)光源和物體表面的明暗程度的感覺(jué),主要是由光線強(qiáng)弱決定的一種視覺(jué)經(jīng)驗(yàn)
LightingColorFilter 光照色彩過(guò)濾器
簡(jiǎn)介:通過(guò)改變光照來(lái)實(shí)現(xiàn)顏色過(guò)濾,可以用來(lái)模擬簡(jiǎn)單的燈光效果。
構(gòu)造:LightingColorFilter(int mul, int add)
參數(shù):mul:色彩倍增,用來(lái)和目標(biāo)像素相乘
? ? ? ? ? ?add:色彩添加,用來(lái)和目標(biāo)像素相加(都是16進(jìn)制的色彩值)
算法:?(RGB值 * mul + Add) % 255,從而得到新的RPG值,整個(gè)過(guò)程中Alpha不參與改變;
PorterDuffColorFilter混排顏色過(guò)濾器
簡(jiǎn)介:通過(guò)指定具體顏色值和PorterDuff混合模式來(lái)實(shí)現(xiàn)圖片顏色的改變。
構(gòu)造:PorterDuffColorFilter(int color, PorterDuff.Mode mode)?
使用:paint.setColorFilter(new PorterDuffColorFilter(color,mode));
? ? ? ? ? ?img.setColorFilter(new?PorterDuffColorFilter(color,mode));

ColorMatrixColorFilter顏色矩陣過(guò)濾器
ColorMatrix顏色矩陣:是(4 * 5)的一個(gè)顏色矩陣,1~4行定義RGBA,第五列定義顏色偏移量


使用封好的api修改顏色矩陣:
setRotate(int axis, float degrees):設(shè)置色調(diào)
setSaturation(float sat):設(shè)置飽和度
setScale(float rScale, float gScale, float bScale, float aScale):設(shè)置亮度

4.處理源圖像和?View?已有內(nèi)容的關(guān)系(混合計(jì)算方式)
setXfermode(Xfermode xfermode)
Xfermode:指的是你要繪制的內(nèi)容和?Canvas?的目標(biāo)位置的內(nèi)容應(yīng)該怎樣結(jié)合計(jì)算出最終的顏色
PorterDuff.Mode:用來(lái)指定兩個(gè)圖像共同繪制時(shí)的顏色策略。(目前只有這個(gè)子類)

在API中Android為我們提供了18種模式(比上圖多了兩種ADD和OVERLAY)
1.Alpha 合成 (Alpha Compositing):PorterDuff算法(描述了12種關(guān)于 Alpha 通道將兩個(gè)圖像共同繪制的操作)
2.混合 (Blending):操作顏色的本身Photoshop軟件里的那些模式(與Alpha、PorterDuff無(wú)關(guān),屬于Google官方加入的)
CLEAR:清除圖像
SRC:只顯示源圖像
DST:只顯示目標(biāo)圖像
SRC_OVER:將源圖像放在目標(biāo)圖像上方
DST_OVER:將目標(biāo)圖像放在源圖像上方
SRC_IN:只在源圖像和目標(biāo)圖像相交的地方繪制【源圖像】
DST_IN:只在源圖像和目標(biāo)圖像相交的地方繪制【目標(biāo)圖像】,繪制效果受到源圖像對(duì)應(yīng)地方透明度影響
SRC_OUT:只在源圖像和目標(biāo)圖像不相交的地方繪制【源圖像】,
? ? ? ? ? ? ? ? ? ? ?相交的地方根據(jù)目標(biāo)圖像的對(duì)應(yīng)地方的alpha進(jìn)行過(guò)濾,目標(biāo)圖像完全不透明則完全過(guò)濾,完全透明則不過(guò)濾
DST_OUT:只在源圖像和目標(biāo)圖像不相交的地方繪制【目標(biāo)圖像】,
? ? ? ? ? ? ? ? ? ? ?在相交的地方根據(jù)源圖像的alpha進(jìn)行過(guò)濾,源圖像完全不透明則完全過(guò)濾,完全透明則不過(guò)濾
SRC_ATOP:在源圖像和目標(biāo)圖像相交的地方繪制【源圖像】,在不相交的地方繪制【目標(biāo)圖像】,
? ? ? ? ? ? ? ? ? ? ? ?相交處的效果受到源圖像和目標(biāo)圖像alpha的影響
DST_ATOP:在源圖像和目標(biāo)圖像相交的地方繪制【目標(biāo)圖像】,在不相交的地方繪制【源圖像】,
? ? ? ? ? ? ? ? ? ? ? ?相交處的效果受到源圖像和目標(biāo)圖像alpha的影響
XOR:在源圖像和目標(biāo)圖像相交的地方之外繪制它們,在相交的地方受到對(duì)應(yīng)alpha和色值影響,如果完全不透明則相交處完全不繪制
DARKEN:變暗,較深的顏色覆蓋較淺的顏色,若兩者深淺程度相同則混合
LIGHTEN:變亮,與DARKEN相反,DARKEN和LIGHTEN生成的圖像結(jié)果與Android對(duì)顏色值深淺的定義有關(guān)
MULTIPLY:正片疊底,源圖像素顏色值乘以目標(biāo)圖像素顏色值除以255得到混合后圖像像素顏色值
SCREEN:濾色,色調(diào)均和,保留兩個(gè)圖層中較白的部分,較暗的部分被遮蓋
ADD:飽和相加,對(duì)圖像飽和度進(jìn)行相加,不常用
OVERLAY:疊加
離屏緩沖(Off-screen Buffer)
簡(jiǎn)介:把內(nèi)容繪制在額外的緩沖層上,再把繪制好的內(nèi)容貼回 View 中(解決直接繪制View層時(shí)范圍外區(qū)域?yàn)楹谏膯?wèn)題)
兩種方式:
1.Canvas.saveLayer():可以做短時(shí)的離屏緩沖
? ??int saved = canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);
? ? canvas.drawXXX();
? ??canvas.restoreToCount(saved);
2.View.setLayerType():直接把整個(gè)?View?都繪制在離屏緩沖中
? ??setLayerType(LAYER_TYPE_HARDWARE):使用 GPU 來(lái)緩沖
????setLayerType(LAYER_TYPE_SOFTWARE)?:直接用一個(gè)?Bitmap?來(lái)緩沖
控制好透明區(qū)域
