基础
Xfermode一共有三个子类AvoidXfermode,PixelXorXfermode及PorterDuffXfermode。
AvoidXfermode
不支持硬件加速,已过时。构造方法如下:public AvoidXfermode(int opColor, int tolerance, Mode mode)。第一参数是目标颜色值,第二个是容差,第三个是模式(AvoidXfermode.MODE.AVOID和AvoidXfermode.MODE.TARGET)。它的主要作用可以概括为:根据模式,在目标颜色值上画或者不画Paint.setColor()为Paint设置的颜色值。
MODE.TARGET:目标。与opColor相差在tolerance内的颜色上会被画上Paint的颜色值。
MODE.AVOID:避免。tolerance的意义也和TARGET不一样。tolerance为0时,那和opColor有一点相似都不会被画上Paint的颜色;tolerance为255时,只要和opColor有一点不一样,那就会被画上Paint的颜色值。
PorterDuffXfermode
它是Xfermode子类之一。在使用Paint.setXfermode()时,传入的参数经常是PorterDuffXfermode的对象。如下:
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XXX));
PorterDuff.Mode
PorterDuff.Mode有十六个值,分别代表不同的效果,应根据需要传入到PorterDuffXfermode()的构造器中。其中的每一个值都是对src与dst的每一个像素点的颜色值进行操作。src指前景、上层,后绘制上的;dst指后景、下层,先绘制上去的。
其实每一个值都是按一定的规则对像素点的颜色值进行加减乘除操作。但,千万不要用数学计算去套这些模式的操作结果,因为数学计算的结果和显示的颜色值是有一定的差别的。但,可以按数学计算公式去估算每一个模式中颜色值的大致变化。
CLEAR
[0,0]
清除画布上DST所占区域的的所有像素值。如Canvas#drawColor(Color.BLACK,Mode.CLEAR)将画布上的所有内容清除掉。
SRC
[Sa,Sc]
显示上层绘制的图片。
DST
[Da, Dc]
显示下层绘制的图片。
SRC_OVER
[Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
DST_OVER
[Sa + (1 - Sa)*Da, Rc = Dc + (1 - Da)*Sc]
SRC_IN
[Sa * Da, Sc * Da]
DST_IN
[Sa * Da, Sa * Dc]
SRC_OUT
[Sa * (1 - Da), Sc * (1 - Da)]
相交部分按公式计算,非相交部分则各保持原样。
DST_OUT
[Da * (1 - Sa), Dc * (1 - Sa)]
相交部分按计算公式计算,DST中非相交部分保持原样。
SRC_ATOP
[Da, Sc * Da + (1 - Sa) * Dc]
显示下层,但相交的部分显示上层。
DST_ATOP
[Sa, Sa * Dc + Sc * (1 - Da)]
按公式计算。如两个都不透明,则相交的部分显示的为Dc。
XOR
[Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc]
相交部分,按公式计算。公式中,如果两个都不透明的话,最终什么都不会显示。
DARKEN
[Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)]
相交部分按数学公式进行计算即可。
LIGHTEN
[Sa + Da - Sa*Da,Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)]
相交部分按数学公式进行计算即可。
MULTIPLY
[Sa * Da, Sc * Dc]
相交部分颜色相乘,得到的结果除以255就是最终的颜色。等效于ps中的正片叠底效果。
SCREEN
[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
相交部分按上述公式计算即可。