在无效(l,t,r,b)之后是否应明确设置剪辑区域?

时间:2016-03-27 14:55:22

标签: java android ondraw clip invalidation

那里的文档似乎表明,如果您使View的多个区域无效(使用invalidate(l,t,r,b)),则无需在onDraw()方法中使用剪辑区域指定这些区域。

另一方面,我见过很多自定义视图的例子,它们保持一个脏区域并使区域无效,然后使用脏区域在onDraw()方法中剪切画布(参见例如,the KeyBoardView class

此问题的文档是否不完整? invalidate()clipRect()应该携手使用吗?

1 个答案:

答案 0 :(得分:0)

不需要与clipRect()同时使用invalidate()。有时您可以独立使用它们,以及何时可以一起使用它们。

作为View上的方法,invalidate()在整个View的级别上工作。使这样的区域无效会导致Android仅重绘已失效的区域,因此您可以通过更改来推送更少的像素。

作为Canvas上的方法,clipRect()会更改该Canvas上后续绘制操作的有效绘图空间。这使您可以执行绘制操作,而无需调整计算以仅影响有限的空间。 Canvas将确保如果您在该空间之外绘制,它将无效。您还可以累积剪辑区域以创建非矩形剪辑区域。

Canvas不必与View关联。很多时候你只想绘制一个Bitmap供以后使用。因此,在Canvas上使用clipRect()可能会或可能不会与View有任何关系,即使这样,也可能与该视图上的失效有关或可能没有任何关系。如果要将两者结合使用作为非常大的绘图空间的优化,则必须确保视图的无效区域等同于“画布”的剪切区域,考虑到剪辑区域,剪辑区域并不总是直截了当并不总是简单的矩形。