android.graphics.Xfermode 是用於解決自定義 Android 2D 圖形渲染管線中「變換模式」問題的基類; 解決的是兩個像素點的混合問題android
APIgit
Xfermode有三個子類:AvoidXfermode, PixelXorXfermode和PorterDuffXfermode。其中AvoidXfermode, PixelXorXfermode已通過時不推薦使用。下面咱們來着重瞭解下PorterDuffXfermodeapp
基本概念ide
PorterDuffXfermode類主要用於圖形合成時的圖像過渡模式計算,其概念來自於1984年在ACM SIGGRAPH計算機圖形學出版物上發表了「Compositing digital images(合成數字圖像)」的Tomas Porter和Tom Duff,合成圖像的概念極大地推進了圖形圖像學的發展,PorterDuffXfermode類名就來源於這倆人的名字組合PorterDuff。下面貼出android SDK中PorterDuff的Mode枚舉類型定義。函數
多種混合模式ui
PorterDuffXfermode的構造函數:this
/** * Create an xfermode that uses the specified porter-duff mode. * * [@param](https://my.oschina.net/u/2303379) mode The porter-duff mode that is applied */ public PorterDuffXfermode(PorterDuff.Mode mode) { this.mode = mode; native_instance = nativeCreateXfermode(mode.nativeInt); }
參數傳入了PorterDuff.Mode mode,如下列出PorterDuff的因此的Mode。能夠看到源碼裏面用一個枚舉來表示.net
// these value must match their native equivalents. See SkXfermode.h 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 (16), /** [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)] */ LIGHTEN (17), /** [Sa * Da, Sc * Dc] */ MULTIPLY (13), /** [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] */ SCREEN (14), /** Saturate(S + D) */ ADD (12), OVERLAY (15); Mode(int nativeInt) { this.nativeInt = nativeInt; } /** * [@hide](https://my.oschina.net/u/1429664) */ public final int nativeInt; }
對應官方示意圖code