08.1 精通自定义 View 之 混合模式——AvoidXfermode

返回自定义 View 目录

8.1.1 混合模式概述

混合模式能够将两张图片无缝结合,实现类似 Photoshop 中的两张图片融合效果。

混合模式是通过 Paint 类中的 Xfermode setXfermode(Xfermode xfermode) 函数实现的,它的参数 Xfermode 是一个空类,主要靠它的子类来实现不同的功能,如下图所示。

在启舰的书里派生自 Xfermode 的子类有 AvoidXfermode、PixelXorXfermode 和 PorterDuffXfermode,并且讲解了相关的知识。但笔者在 2019 年最新的官方文档中,已经找不到 AvoidXfermode 和 PixelXorXfermode 这两个类的相关文档,且在 AndroidX 系列中不支持相关 API。若想了解详情,请点击前往启舰的博客

在使用 Xfermode 时,需要做两件事。
1)禁用硬件加速

1
setLayerType(View.LAYER_TYPE_SOFTWARE, null);

2)使用离屏绘制(详见第九章)

1
2
3
4
5
6
7
8
// 新建图层
int layerId = canvas.saveLayer(0,0,getWidth(),getHeight(),null, Canvas.ALL_SAVE_FLAG);
// 核心绘制代码
...
// 还原图层
canvas.restoreToCount(layerId);