顏色相關(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)域里一個通用的概念,是一種顏色方案或著色規(guī)則紊搪。
setShader(Shader shader)
Shader.TileMode:端點范圍之外的著色規(guī)則
CLAMP:在端點之外延續(xù)端點處的顏色(即超出邊緣使用邊緣處顏色)
MIRROR:鏡像模式
REPEAT:重復(fù)模式
LinearGradient 線性漸變
簡介:設(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:漸變的兩個端點的位置?
? ? ? ? ? ?color0,color1,int[] colors:兩個或一組顏色
? ? ? ? ? ?positions:顏色數(shù)組的相對位置
? ? ? ? ? ?tile:平鋪方式
RadialGradient 輻射漸變
簡介:從中心向周圍輻射狀的漸變。
構(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 掃描、梯度漸變
簡介:以某個點位中心旋轉(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 位圖著色
簡介:用?Bitmap?的像素來作為圖形或文字的填充。
構(gòu)造方法: BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
參數(shù): bitmap:用來做模板的?Bitmap?對象?
? ? ? ? ? ? tileX:X軸方向上位圖的銜接形式
? ? ? ? ? ? tileY:Y軸方向上位圖的銜接形式
ComposeShader混合著色器
簡介:著色效果的疊加径荔,比如將BitmapShader與LinearGradient的混合渲染 督禽。
構(gòu)造:ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)他宛;
參數(shù):shaderA,?shaderB:兩個相繼使用的?Shader?
? ? ? ? ? ?mode:兩個?Shader?的疊加模式
使用
3.顏色過濾
簡介:為繪制的內(nèi)容設(shè)置一個統(tǒng)一的過濾策略威沫,然后?Canvas.drawXXX()?方法會對每個像素都進(jìn)行過濾后再繪制出來膛堤。
setColorFilter(ColorFilter colorFilter)
顏色相關(guān)知識
光的三原色:紅蛋褥、綠、藍(lán)(三色相加是白色忙干,所以是加色模式物赶,即黑色環(huán)境中用光后環(huán)境變亮)
色(顏料)的三原色:紅室梅、黃荸频、藍(lán)(三色相加是黑色菱肖,所以是減色模式,即在白色材料上使用顏料后讓它變暗了)
RGBA模型:R(Red紅色)旭从,G(Green綠色)稳强,B(Blue藍(lán)色)场仲,A(Alpha透明度)
色調(diào)(色相/顏色):物體的顏色
飽和度(彩度):色彩的鮮艷度。顏色的純度:0(灰)~100%(飽和)
亮度(明度):眼睛對光源和物體表面的明暗程度的感覺键袱,主要是由光線強(qiáng)弱決定的一種視覺經(jīng)驗
LightingColorFilter 光照色彩過濾器
簡介:通過改變光照來實現(xiàn)顏色過濾燎窘,可以用來模擬簡單的燈光效果摹闽。
構(gòu)造:LightingColorFilter(int mul, int add)
參數(shù):mul:色彩倍增蹄咖,用來和目標(biāo)像素相乘
? ? ? ? ? ?add:色彩添加,用來和目標(biāo)像素相加(都是16進(jìn)制的色彩值)
算法:?(RGB值 * mul + Add) % 255付鹿,從而得到新的RPG值澜汤,整個過程中Alpha不參與改變;
PorterDuffColorFilter混排顏色過濾器
簡介:通過指定具體顏色值和PorterDuff混合模式來實現(xiàn)圖片顏色的改變舵匾。
構(gòu)造:PorterDuffColorFilter(int color, PorterDuff.Mode mode)?
使用:paint.setColorFilter(new PorterDuffColorFilter(color,mode))俊抵;
? ? ? ? ? ?img.setColorFilter(new?PorterDuffColorFilter(color,mode));
ColorMatrixColorFilter顏色矩陣過濾器
ColorMatrix顏色矩陣:是(4 * 5)的一個顏色矩陣坐梯,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)系(混合計算方式)
setXfermode(Xfermode xfermode)
Xfermode:指的是你要繪制的內(nèi)容和?Canvas?的目標(biāo)位置的內(nèi)容應(yīng)該怎樣結(jié)合計算出最終的顏色
PorterDuff.Mode:用來指定兩個圖像共同繪制時的顏色策略。(目前只有這個子類)
在API中Android為我們提供了18種模式(比上圖多了兩種ADD和OVERLAY)
1.Alpha 合成 (Alpha Compositing):PorterDuff算法(描述了12種關(guān)于 Alpha 通道將兩個圖像共同繪制的操作)
2.混合 (Blending):操作顏色的本身Photoshop軟件里的那些模式(與Alpha吵血、PorterDuff無關(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)圖像】,繪制效果受到源圖像對應(yīng)地方透明度影響
SRC_OUT:只在源圖像和目標(biāo)圖像不相交的地方繪制【源圖像】蹋辅,
? ? ? ? ? ? ? ? ? ? ?相交的地方根據(jù)目標(biāo)圖像的對應(yīng)地方的alpha進(jìn)行過濾钱贯,目標(biāo)圖像完全不透明則完全過濾,完全透明則不過濾
DST_OUT:只在源圖像和目標(biāo)圖像不相交的地方繪制【目標(biāo)圖像】侦另,
? ? ? ? ? ? ? ? ? ? ?在相交的地方根據(jù)源圖像的alpha進(jìn)行過濾秩命,源圖像完全不透明則完全過濾,完全透明則不過濾
SRC_ATOP:在源圖像和目標(biāo)圖像相交的地方繪制【源圖像】褒傅,在不相交的地方繪制【目標(biāo)圖像】弃锐,
? ? ? ? ? ? ? ? ? ? ? ?相交處的效果受到源圖像和目標(biāo)圖像alpha的影響
DST_ATOP:在源圖像和目標(biāo)圖像相交的地方繪制【目標(biāo)圖像】,在不相交的地方繪制【源圖像】殿托,
? ? ? ? ? ? ? ? ? ? ? ?相交處的效果受到源圖像和目標(biāo)圖像alpha的影響
XOR:在源圖像和目標(biāo)圖像相交的地方之外繪制它們霹菊,在相交的地方受到對應(yīng)alpha和色值影響,如果完全不透明則相交處完全不繪制
DARKEN:變暗,較深的顏色覆蓋較淺的顏色碌尔,若兩者深淺程度相同則混合
LIGHTEN:變亮浇辜,與DARKEN相反,DARKEN和LIGHTEN生成的圖像結(jié)果與Android對顏色值深淺的定義有關(guān)
MULTIPLY:正片疊底唾戚,源圖像素顏色值乘以目標(biāo)圖像素顏色值除以255得到混合后圖像像素顏色值
SCREEN:濾色柳洋,色調(diào)均和,保留兩個圖層中較白的部分,較暗的部分被遮蓋
ADD:飽和相加,對圖像飽和度進(jìn)行相加,不常用
OVERLAY:疊加
離屏緩沖(Off-screen Buffer)
簡介:把內(nèi)容繪制在額外的緩沖層上叹坦,再把繪制好的內(nèi)容貼回 View 中(解決直接繪制View層時范圍外區(qū)域為黑色的問題)
兩種方式:
1.Canvas.saveLayer():可以做短時的離屏緩沖
? ??int saved = canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);
? ? canvas.drawXXX();
? ??canvas.restoreToCount(saved);
2.View.setLayerType():直接把整個?View?都繪制在離屏緩沖中
? ??setLayerType(LAYER_TYPE_HARDWARE):使用 GPU 來緩沖
????setLayerType(LAYER_TYPE_SOFTWARE)?:直接用一個?Bitmap?來緩沖