转自点击打开链接
在Android绘图开发中,Paint.setXfermode()和Canvas.saveLayer()是两个重要的方法了。很多网友都不是很明白,我也一直不明白,花了几天时间来研究了这两个方法,略有领悟,记录下来,归纳总结,也给新手一点帮助。
Android中Canvas绘图之PorterDuffXfermode使用及工作原理详解
这篇文章给了我很大的帮助,大家看这篇文章应该就可以明白,我把我在学习的过程中遇到的问题说清楚。
Paint.setXfermode()
设置两张图片相交时的模式,好像说有18中模式,每种模式的规则都不一样,这也没什么好说的。
在设置Paint.setXfermode()之前Canvas上的内容就是DST,不管Canvas是透明的还是颜色,或者是已经画了一个图,反正这个Canvas就算作DST了,Paint.setXfermode()之后画的就是SRC了,Paint.setXfermode()就是设置DST和SRC相交区域混合模式。不错,是相交区域,Android中Canvas绘图之PorterDuffXfermode使用及工作原理详解 上面说的很清楚了,我们不要被这张图迷惑了
官方的这张图也是为了让我们更好的理解。
这时我们看下Canvas.saveLayer()这个方法,它的作用是生成一个新的层,这个层是透明的,之后的所有drawxx的方法都是在这个层上进行的,可能一些新手要问了,我们为什么要在这个新层上画了,直接在Canvas上画不好吗,大家想下,当我们在Canvas上画了很多东西以后,我们之后画的新图是不是直接在之前的画板作画,这样不就会影响画出的图形吗。但是使用Canvas.saveLayer()就不一样了,他完全是个全新的画板,上面是透明的,我们可以任意的设置颜色和画任何的图形,而对之前的Canvas不会造成任何影响,最后我们使用restoreToCount()将新的层与底下的Canvas相结合就形成一个完整的图像。
我们反过来看Paint.setXfermode()这个方法,如果没有Canvas.saveLayer()方法的调用,我们使用Paint.setXfermode()这个方法就是把当前的Canvas上的内容当做DST,如果我们在调用Canvas.saveLayer()方法之后,就把当前的层上的内容作为DST了,这个时候大家应该就知道了为什么在设置Paint.setXfermode()的时候,要在Canvas.saveLayer()和Canvas.restoreToCount()之间使用了,就是为了不影响底下Canvas已经画好的图,Canvas.restoreToCount()调用之后,两个层叠起来就是整个View上的图像了,这跟Photoshop上的层,差不多了。希望对大家有帮助!!!