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)域里一個通用的概念,是一種顏色方案或著色規(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è)置亮度

api使用

4.處理源圖像和?View?已有內(nèi)容的關(guān)系(混合計算方式)

setXfermode(Xfermode xfermode)

Xfermode:指的是你要繪制的內(nèi)容和?Canvas?的目標(biāo)位置的內(nèi)容應(yīng)該怎樣結(jié)合計算出最終的顏色

PorterDuff.Mode:用來指定兩個圖像共同繪制時的顏色策略。(目前只有這個子類)

18種模式

在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?來緩沖

控制好透明區(qū)域

由于透明區(qū)域過小而覆蓋不到的地方熊镣,將不會受到 Xfermode 的影響
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绪囱,更是在濱河造成了極大的恐慌测蹲,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鬼吵,死亡現(xiàn)場離奇詭異扣甲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)齿椅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門琉挖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涣脚,你說我怎么就攤上這事示辈。” “怎么了遣蚀?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵矾麻,是天一觀的道長。 經(jīng)常有香客問我芭梯,道長险耀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任粥帚,我火速辦了婚禮胰耗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芒涡。我一直安慰自己柴灯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布费尽。 她就那樣靜靜地躺著赠群,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旱幼。 梳的紋絲不亂的頭發(fā)上查描,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機(jī)與錄音柏卤,去河邊找鬼冬三。 笑死,一個胖子當(dāng)著我的面吹牛缘缚,可吹牛的內(nèi)容都是我干的勾笆。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼桥滨,長吁一口氣:“原來是場噩夢啊……” “哼窝爪!你這毒婦竟也來了弛车?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蒲每,失蹤者是張志新(化名)和其女友劉穎纷跛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邀杏,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡贫奠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了淮阐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叮阅。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡刁品,死狀恐怖泣特,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挑随,我是刑警寧澤状您,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站兜挨,受9級特大地震影響膏孟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拌汇,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一柒桑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧噪舀,春花似錦魁淳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纺座,卻和暖如春息拜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背净响。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工少欺, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人馋贤。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓赞别,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掸掸。 傳聞我的和親對象是個殘疾皇子氯庆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361