Xfermode简单用法和PorterDuffXfermode的一些叠加模式

引言

Xfermode是android.graphics下面的类,是一些常用绘图传递模式的基类,当这种转换模式被指派给某个画笔的时候,画笔会按照这种转换模式进行绘图,下面是官网api文档里面的原话。

Xfermode is the base class for objects that are called to implement custom “transfer-modes” in the drawing pipeline. The static function Create(Modes) can be called to return an instance of any of the predefined subclasses as specified in the Modes enum. When an Xfermode is assigned to an Paint, then objects drawn with that paint have the xfermode applied.

常用的直接子类

最常用的还是PorterDuffXfermode,他有一个构造函数,传入的参数是PorterDuff.Mode,是一个枚举类型,有12种Alpha透明度合成模式和5种混合合成模式。
PorterDuff名称的由来:

用法与预览

1
2
3
4
5
6
7
8
Paint paint = new Paint();
//先画目标图像destinationImage
canvas.drawBitmap(destinationImage, 0, 0, paint);
PorterDuff.Mode mode = // choose a mode
paint.setXfermode(new PorterDuffXfermode(mode));
//再画源图像 sourceImage
//谁是sourceImage和destinationImage与后面的dst和src模式有关,自行判断
canvas.drawBitmap(sourceImage, 0, 0, paint);

透明度合成模式的12种如下图:

混合合成模式如下图:

简单来实践下

以之前来弄的哪个圆形图片为例,我们需要一个bitmap类型的源图片,然后再画一个bitmap类型的圆,我们要的效果是用圆在原图片上做个切割,但是原图片在上面,所以可以选择SRC_IN和SRC_ATOP,一种是只显示sourceImage被切割之后的部分,不显示destinationImage;另一个是两样都显示,如果切割的图片大小制定不科学的话,就会有多出来的部分。
我们先看下DST_OVER的效果:

再看看SRC_IN的也就是我们想要的效果:

PS:画src和dst的画笔必须要是同一对象