PorterDuffXfermode 笔记

36 阅读4分钟

image.png

黄色圆为dst,蓝色矩形为src

灯光高亮效果可以用Model.LIGHTEN

两张图片一方是透明,结果也是透明可以使用Model.MULTIPLY(正片叠加)

SRC_IN 可以用来实现圆角效果或者图片倒影

SRC_OUT 可以用来实现类似刮刮卡效果。

使用PorterDuffXfermode必须配合Canvas.saveLayer是因为Xfermode是在一个独立的图层(Layer)上操作目标图像和源图像的像素混合saveLayer创建了一个新的、透明的画板,让后续绘制的“目标图像”(DST)与基础画布上的内容隔离,从而实现精确的像素混合计算,最后restore时将混合结果“合成”回原画布,避免影响底下的图层或直接在原始画布上计算出不可预期的结果,模拟了Photoshop的图层效果。

为什么需要saveLayer

  1. 隔离绘制环境 (新画布)

    • saveLayer创建了一个临时的、全透明的位图 (Bitmap) 画布,所有在它和restore之间的绘制操作都发生在这个新画布上。
    • 这就像 Photoshop 里的新图层,保证了你绘制的“目标图”不会立即与下面已经画好的内容混合。
  2. 提供准确的源 (SRC) 和目标 (DST) 图像

    • Xfermode的工作原理是混合当前画笔(源 SRC)和当前画布(目标 DST)上的像素。
    • 如果没有saveLayer,你的“目标图”可能就是你之前画的整个屏幕(例如,一个满屏的背景色),而你用画笔画的形状(源图)会直接与这个“目标图”的对应像素混合,结果往往不是你想要的遮罩或擦除效果。
    • 有了saveLayer,你可以在新图层上先画好“目标图”(比如一个实心圆),然后用画笔画“源图”(比如一个矩形),再用Xfermode(如SRC_IN),就能得到“源图”在“目标图”相交区域内的效果。
  3. 结果合并 (合成)

    • 当调用Canvas.restoreToCountrestore()时,这个新创建的图层上的所有内容(源和目标混合后的结果)会作为一个整体,“绘制”到它下面的图层(或原始画布)上。