我们的手机屏幕是由很多的像素组成的,而每一个像素的颜色都是由四个分量组成,即ARGB,A表示的是我们Alpha值,RGB(Red,Green,Blue)表示的是颜色值。
当我们在屏幕(Canvas)中绘制的时候,如果对应位置的像素点已经绘制过了,即不是透明的,有颜色了,默认的情况下,Android的处理方式是直接覆盖替换对应位置的像素值,如果不想直接这样的覆盖替换的话,那就要用到xfermode,使其按照一定的规则去更改对应位置的像素值,即Xfermode是指定了像素合成的规则。利用Xfermode可以实现很多丰富的效果,如:圆形头像,倒影图片,心电图等。
Xfermode,唯一子类PorterDuffXfermode,在使用的时候,一般都是直接使用其子类。
在自定义组件的时候,一般都是通过Paint.setXfermode方法,来使用Xfermode,这里就需要理解原像素(图片)和目标像素(图片),我的理解是:在Paint.setXfermode方法之前绘制的图片像素为目标像素,之后绘制的为源像素。
S表示的是原像素,原像素的值表示[Sa,Sc] Sa表示的就是源像素的Alpha值,Sc表示源像素的颜色值
D表示的是目标像素,目标像素的值表示[Da,Dc] Da表示的就是目标像素的Alpha值
通过使用Xfermode将绘制的图形的像素和Canvas上对应位置的像素按照一定的规则进行混合,形成新的像素,再更新到Canvas中形成最终的图形
使用的时候都是通过Paint.setXfermode
这里只是个人的一些理解,不过过多的效果实现,实现的demo地址:
https://github.com/meiSThub/DN_Homework/tree/master/app/src/main/java/com/mei/test/ui/xfermode
推荐两篇看过的写的很好的博客:
(1)Android中Canvas绘图之PorterDuffXfermode使用及工作原理详解:http://blog.csdn.net/iispring/article/details/50472485
(2)Android Xfermode 实战 实现圆形、圆角图片http://blog.csdn.net/lmj623565791/article/details/42094215
(3)Xfermode in android (写的最好的)
http://weishu.me/2015/09/23/Xfermode-in-android/