Android Xfermode 原

Android Xfermode

前言

android.graphics.Xfermode 是用於解決自定義 Android 2D 圖形渲染管線中「變換模式」問題的基類; 解決的是兩個像素點的混合問題

用法

  • API

    Xfermode有三個子類:AvoidXfermode, PixelXorXfermode和PorterDuffXfermode。其中AvoidXfermode, PixelXorXfermode已經過時不推薦使用。下面我們來着重瞭解下PorterDuffXfermode

  • 基本概念

    PorterDuffXfermode類主要用於圖形合成時的圖像過渡模式計算,其概念來自於1984年在ACM SIGGRAPH計算機圖形學出版物上發表了“Compositing digital images(合成數字圖像)”的Tomas Porter和Tom Duff,合成圖像的概念極大地推動了圖形圖像學的發展,PorterDuffXfermode類名就來源於這倆人的名字組合PorterDuff。下面貼出android SDK中PorterDuff的Mode枚舉類型定義。

  • 多種混合模式

    PorterDuffXfermode的構造函數:

      /**
       * 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。可以看到源碼裏面用一個枚舉來表示

      // 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;
      }
    

    對應官方示意圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章