Paint顏色相關(guān)

顏色相關(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,第五列定義顏色偏移量

矩陣
簡(jiǎn)單使用

使用封好的api修改顏色矩陣:

setRotate(int axis, float degrees):設(shè)置色調(diào)

setSaturation(float sat):設(shè)置飽和度

setScale(float rScale, float gScale, float bScale, float aScale):設(shè)置亮度

api使用

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è)子類)

18種模式

在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ū)域

由于透明區(qū)域過(guò)小而覆蓋不到的地方,將不會(huì)受到 Xfermode 的影響
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容