![Android App开发进阶与项目实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/109/44510109/b_44510109.jpg)
3.4.1 画布的绘图层次
画布Canvas上的绘图操作都是在同一个图层上进行的,这意味着如果存在重叠区域,后面绘制的图形就必然覆盖前面的图形。绘图是比较复杂的事情,不是直接覆盖这么简单,有些特殊的绘图操作往往需要做与、或、非运算,如此才能实现百变的图像特效。
Android给画布的图层显示制定了许多规则,详细的图层显示规则见表3-6。表中的上层指的是后绘制的图形Src,下层指的是先绘制的图形Dst。
表3-6 图层模式的取值说明
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-T106_17398.jpg?sign=1739262541-om8pXKMpnqQanaxMojHidAPaxScDM8Wm-0-888bb158bb586995206446ecaf274091)
这些图层规则的文案有点令人费解,还是看画面效果比较直观。在图3-30中,圆圈是先绘制的下层图形,正方形是后绘制的上层图形,图例展示了运用不同规则时的显示画面。
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P107_7949.jpg?sign=1739262541-nbYkSfuDUF8P9IKYPiUKzUgJ4ip356Ta-0-a7b1a2da9f223d45b07ac35b66b67a5e)
图3-30 各种图层规则的画面效果
具体到编码而言,需要在当前画布之外再准备一个遮罩画布,遮罩画布绘制上层图形,而当前画布绘制下层图形。同时指定两个画布的混合图层模式,并根据该模式在当前画布盖上遮罩画布。为此自定义演示用的图层视图示例代码如下:
(完整代码见animation\src\main\java\com\example\animation\widget\LayerView.java)
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P107_17401.jpg?sign=1739262541-SAZRYPGXynTEWmAZuRLgfKrBwhzjdJbM-0-82bf69cc8e2666667cafc854c07cbb48)
然后在布局文件中添加LayerView节点,并在对应的活动页面调用setMode方法设置绘图模式。运行并测试该App,可观察到图层覆盖效果如图3-31~图3-36所示。图3-31为只显示轮廓的画面,图3-32为SRC_OVER模式的画面,图3-33为DST_OVER模式的画面,图3-34为SRC_OUT模式的画面,图3-35为DST_OUT模式的画面,图3-36为XOR模式的画面,这些画面效果都能跟表3-6对得上。
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P109_7963.jpg?sign=1739262541-cZagKXrScvFZS8UotM8PS10755Pera4x-0-22cd00ce79c40e847b4d36fada820402)
图3-31 只显示轮廓的画面
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P109_7965.jpg?sign=1739262541-ZUVZAe4sltkPGWjYMaGp1W20hM25iFah-0-0d446e4ba08a0bfd714efdc203fd39f4)
图3-32 SRC_OVER模式的画面
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P109_7984.jpg?sign=1739262541-RrErpbG9jPKkH4APu42h9MUWWxahssaw-0-0d4501625b793e31720ed14d8b0e7e65)
图3-33 DST_OVER模式的画面
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P109_7985.jpg?sign=1739262541-1A4SFwSdRzg9XxkP9EXZgonTXkugVJXU-0-5f1789f3b9d2a132bebe8e21af863536)
图3-34 SRC_OUT模式的画面
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P109_8003.jpg?sign=1739262541-bMWlCDGIYFS4HYc8aXnTDSFvvvoZIbNp-0-f03c1ca29c87efa812a046eb31b3437e)
图3-35 DST_OUT模式的画面
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P109_8005.jpg?sign=1739262541-AqOG1uhoFWEA7zLUMpLmtKSg6h5lk17E-0-981d4a05ad54fec7b4d40c5fd3da4ee7)
图3-36 XOR模式的画面