Android - Canvas.clipRect() - 移除现有裁剪区域

15
我有一个Canvas对象,在某个时候我设置了一个剪辑区域,这样我就可以在“窗口/部分”中绘制,而不必担心溢出到画布的其他部分。
在我完成绘制“窗口”后,我想要删除该剪辑区域,但似乎无法做到。
没有删除剪辑区域的函数,当我尝试在整个画布上应用新的剪辑区域时,该剪辑区域没有被应用-在应用新的剪辑区域后立即调用canvas.getClipBounds()会返回一个带有先前剪辑区域的矩形。

你如何将新的剪辑应用于整个画布? - eduyayo
我尝试过类似canvas.setClip(0,0,viewWidth,viewHeight)的方法,也尝试了应用剪辑的本地坐标,如果left是8,那么新的left将是-8,但两者都没有起作用。 - Aviran
1
setClip or clipRect? - eduyayo
你需要使用 clipRect(Rect rect, Region.Op op) 函数,并将操作符 op 设置为 Union,这样它就会添加裁剪区域。如果不指定添加操作,它会不断地裁剪更多的区域。这有点像布尔运算中的交集。你可以使用 canvas.save() 在裁剪之前保存画布状态,然后进行裁剪、绘制操作,最后使用 canvas.restore() 恢复完整的裁剪边界。同时,你也可以将 Union 操作应用于整个画布。 - eduyayo
顺便提一下,注意到clipRect的Javadoc指定裁剪将应用于当前裁剪区域,因此它是一个AND操作,相交两个路径。 - eduyayo
2个回答

40

在设置剪辑矩形之前使用canvas.save(),然后使用canvas.restore()来舍弃剪辑矩形。


谷歌的API通常很愚蠢。有关“保存”的文档 - 将当前矩阵和剪辑保存到私有堆栈上。- 然后尝试将您的API命名为SaveMatrixAndClippingSettings Google。 - Johann

0

你必须使用'clipRect(Rect rect,Region.Op op)'和op Union一起使用,这样它就会添加。它会不断地裁剪,直到您指定添加操作。这有点像布尔交集。将联合设置为所有表面。此外,您可以在裁剪之前使用canvas.save(),裁剪,绘制,然后恢复以再次拥有完整的剪辑边界。

顺便说一下,注意clipRect的javadoc指定剪辑将应用于当前剪辑,因此它是AND操作,相交两个路径


1
我收到了一个错误提示,指出不允许使用Union,所以这个答案不再是有效的。下面的答案可以完成任务并且非常好用。 - slott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接