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; }
对应官方示意图