UI繪制_Paint的Xfermode

上一篇講了Paint的渲染部分劝评,

UI繪制_Paint的高級(jí)渲染 http://www.reibang.com/p/cce8044d049d

而這篇我們來(lái)學(xué)習(xí)一下圖像混合的mode,通過(guò)使用Xfermode將繪制的圖形的像素和Canvas上對(duì)應(yīng)位置的像素按照一定的規(guī)則進(jìn)行混合倦淀,形成新的像素蒋畜,再更新到Canvas中形成最終的圖形使用的時(shí)候都是通Paint.setXfermode

我們一個(gè)像素的顏色都是由四個(gè)分量組成,即ARGB撞叽,A表示的是我們Alpha值姻成,RGB表示的是顏色,在講解Xfermode的時(shí)候需要了解一下PorterDuff.mode

public class PorterDuff {
    public enum Mode {
        /** [0, 0] */
        CLEAR       (0),
        /** [Sa, Sc] */
        SRC         (1),
        /** [Da, Dc] */
        DST         (2),
        /** [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc] */
        SRC_OVER    (3),
        /** [Sa + (1 - Sa)*Da, Rc = Dc + (1 - Da)*Sc] */
        DST_OVER    (4),
        /** [Sa * Da, Sc * Da] */
        SRC_IN      (5),
        /** [Sa * Da, Sa * Dc] */
        DST_IN      (6),
        /** [Sa * (1 - Da), Sc * (1 - Da)] */
        SRC_OUT     (7),
        /** [Da * (1 - Sa), Dc * (1 - Sa)] */
        DST_OUT     (8),
        /** [Da, Sc * Da + (1 - Sa) * Dc] */
        SRC_ATOP    (9),
        /** [Sa, Sa * Dc + Sc * (1 - Da)] */
        DST_ATOP    (10),
        /** [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] */
        XOR         (11),
        /** [Sa + Da - Sa*Da,
             Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)] */
        DARKEN      (12),
        /** [Sa + Da - Sa*Da,
             Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)] */
        LIGHTEN     (13),
        /** [Sa * Da, Sc * Dc] */
        MULTIPLY    (14),
        /** [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] */
        SCREEN      (15),
        /** Saturate(S + D) */
        ADD         (16),
        OVERLAY     (17);

    Mode(int nativeInt) {
        this.nativeInt = nativeInt;
    }

    public final int nativeInt;
    }
}

S表示的是原像素愿棋,原像素的值表示[Sa,Sc] Sa表示的就是源像素的Alpha值科展,Sc表示源像素的顏色值

D表示的是目標(biāo)像素,目標(biāo)像素的值表示[Da,Dc] Da表示的就是目標(biāo)像素的Alpha值

效果圖


下面講解一些常用的mode

  • SRC_IN [Sa * Da, Sc * Da]
    處理圖片相交區(qū)域時(shí)糠雨,受到目標(biāo)圖片的Alpha值影響才睹,當(dāng)目標(biāo)圖片的透明度為0時(shí),源圖片就不會(huì)顯示
    效果如下


核心代碼

int layerId = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG);
canvas.drawBitmap(dest_img, 0, 0, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
canvas.drawBitmap(src_img, 0, 0, paint);
paint.setXfermode(null);
canvas.restoreToCount(layerId);
  • SRC_OUT [Sa * (1 - Da), Sc * (1 - Da)]
    和SRC_IN一樣,不同的是當(dāng)目標(biāo)圖片的透明度為不透明時(shí),源圖片就不會(huì)顯示

效果如下

guagua.gif

核心

  • SRC_ATOP [Da, Sc * Da + (1 - Sa) * Dc]
    當(dāng)透明度為100%和0%時(shí)琅攘,SRC_IN 和 SRC_ATOP是通用的真椿,當(dāng)透明度不為上述的兩個(gè)值時(shí),SRC_ATOP 比 SRC_IN 源圖像的飽和度會(huì)增加乎澄,變得更亮一些突硝。所以效果上是和SRC_IN一樣的,可以用SRC_IN替換成SRC_ATOP

  • DST_IN [Sa * Da, Sa * Dc]
    正好和SRC_IN 相反置济,當(dāng)源圖片的透明度為0的時(shí)候解恰,目標(biāo)圖片完全不顯示

效果如下

核心代碼

canvas.drawBitmap(src_img, 0, 0, paint);
int layerId = canvas.saveLayer(0, 0, src_img.getWidth(), src_img.getHeight(), null, Canvas.ALL_SAVE_FLAG);
canvas.drawBitmap(dest_img, new Rect(dx, 0, dx + src_img.getWidth(), src_img.getHeight()), new Rect(0, 0, src_img.getWidth(), src_img.getHeight()), paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(src_img, 0, 0, paint);
paint.setXfermode(null);
canvas.restoreToCount(layerId);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市浙于,隨后出現(xiàn)的幾起案子护盈,更是在濱河造成了極大的恐慌,老刑警劉巖羞酗,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腐宋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡檀轨,警方通過(guò)查閱死者的電腦和手機(jī)胸竞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)参萄,“玉大人卫枝,你說(shuō)我怎么就攤上這事《锟妫” “怎么了校赤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)筒溃。 經(jīng)常有香客問(wèn)我马篮,道長(zhǎng),這世上最難降的妖魔是什么怜奖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任浑测,我火速辦了婚禮,結(jié)果婚禮上烦周,老公的妹妹穿的比我還像新娘尽爆。我一直安慰自己,他們只是感情好读慎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著槐雾,像睡著了一般夭委。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天株灸,我揣著相機(jī)與錄音崇摄,去河邊找鬼。 笑死慌烧,一個(gè)胖子當(dāng)著我的面吹牛逐抑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屹蚊,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼眯漩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蔓挖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤舍杜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后邦邦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體及舍,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年芹壕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了汇四。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踢涌,死狀恐怖船殉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斯嚎,我是刑警寧澤利虫,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站堡僻,受9級(jí)特大地震影響糠惫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钉疫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一硼讽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牲阁,春花似錦固阁、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至凌唬,卻和暖如春并齐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工况褪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撕贞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓测垛,卻偏偏與公主長(zhǎng)得像捏膨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子食侮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容