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

    对应官方示意图

转载于:https://my.oschina.net/caipeng/blog/2050860

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值