java - 是否应该在 invalidate(l,t,r,b) 之后显式设置剪辑区域?

标签 java android ondraw clip invalidation

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

另一方面,我见过许多自定义 View 的示例,它们在使区域无效的同时维护脏区域,然后在 onDraw() 方法中使用脏区域来裁剪 Canvas (例如,参见 the KeyBoardView class )

关于此问题的文档是否不完整? invalidate()clipRect() 应该同时使用吗?

最佳答案

不需要同时使用invalidate()和clipRect()。有时您可以单独使用它们,有时您可以一起使用它们。

作为 View 上的一个方法,invalidate() 作用于整个 View 级别。像这样使区域失效会导致 Android 仅重绘已失效的区域,因此您会因更改而推送更少的像素。

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

Canvas 不必与 View 关联。很多时候您只是想绘制位图以供以后使用。因此,在 Canvas 上使用 ClipRect() 可能与 View 有任何关系,也可能没有任何关系,即使如此,也可能与该 View 的失效有任何关系,也可能没有任何关系。如果您想将两者一起使用以优化非常大的绘图空间,则必须确保 View 的无效区域相当于 Canvas 的剪切区域,考虑到剪切区域并不总是简单的矩形,这并不总是简单的。

关于java - 是否应该在 invalidate(l,t,r,b) 之后显式设置剪辑区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36248741/

相关文章:

android - 如何使用appium处理android中的警报

Android:在圆内画圆弧

java - 为什么我的矩形没有在我的 Canvas 方法中更新?(android java)

Android Canvas 绘图不可见

java - Android Java Handler,线程同步块(synchronized block)(notifyall和Wait)

java - 在jpanel上画线

android:targetPackage 无法解析符号

javascript - 找不到 'aapt' 工具!您可能需要更新您的 Android SDK,包括平台工具

java - JSch 多个隧道/跳跃站

java - 在其他日期选择器中选择日期时如何禁用日期选择器中的日期