1''*_*1'' 9 android invalidation android-canvas
看起来Android真的不喜欢invalidate (Rect dirty),它只用于使画布的一部分无效.当我使画布的一部分无效(在下面以绿色显示)并且画布的ToggleButton 外部需要同时重绘时,以红色显示的整个区域将被删除!似乎Android只是使最小矩形内的所有内容无效,包含需要重绘的两个区域的并集,即使其中一个区域位于View的外部,我的画布也无效.
这是标准行为,如果是这样,为什么有人会使用部分失效?

Eya*_*sha 16
Android有一个叫做的类ViewRootImpl.这个类由你在屏幕上看到的每个窗口拥有(术语窗口在这里有点令人困惑,因此对于这个解释,窗口是主要活动的布局,顶部没有任何对话框或弹出窗口).这个布局一直在遍历,这意味着Android只是等待这个窗口有一个脏矩形并绘制它.由于此窗口可能包含许多视图(按钮等),因此它会遍历所有视图并询问每个视图是否需要重绘.每个视图都返回一个脏矩形ViewRootImpl,所有这些矩形都连接到一个最后重绘的大矩形.
为什么这样做?好吧,ViewRootImpl要求WindowManagerService一个Canvas人借鉴.这意味着Canvas每次进行遍历时,一个窗口中的所有视图实际上都会共享.
至于你的问题,如果只有一个特定View的脏矩形,那么只绘制那个脏矩形,但由于另一个视图也有一个,所以脏矩形包含两者.
小智 5
该问题是由硬件加速引起的。您必须在活动中禁用它才能使用invalidate(dirty rect)。要在活动中禁用硬件加速,请打开清单文件并添加:
android:hardwareAccelerated="false"
Run Code Online (Sandbox Code Playgroud)
现在您可以使用invalidate(dirty rect).
| 归档时间: |
|
| 查看次数: |
5214 次 |
| 最近记录: |