似乎Android真的不喜欢invalidate (Rect dirty)
,它仅用于使画布的一部分无效。当我使画布的一部分无效(在下面以绿色显示)并且画布外的ToggleButton
需要同时重绘时,以红色显示的整个区域将被删除!似乎Android只是使包含需要重绘的两个区域的并集的最小矩形内的所有内容无效,即使其中一个区域位于View的画布之外我也无效。
这是标准行为,如果是这样,为什么有人会使用部分失效?
答案 0 :(得分:15)
Android有一个名为ViewRootImpl
的类。这个类由你在屏幕上看到的每个窗口拥有(术语窗口在这里有点令人困惑,因此对于这个解释,窗口是主要活动的布局,顶部没有任何对话框或弹出窗口)。
这个布局一直在遍历,这意味着Android只是等待这个窗口有一个脏矩形并绘制它。由于此窗口可能包含许多视图(按钮等),因此它会遍历所有视图并询问每个视图是否需要重绘。
每个视图都会将一个脏矩形返回到ViewRootImpl
,所有这些矩形都会连接到最后重绘的一个大矩形。
为什么这样做?好吧,ViewRootImpl
要求WindowManagerService
一个Canvas
来吸引。这意味着每次进行遍历时,一个窗口中的所有视图实际上都会共享Canvas
。
至于你的问题,如果只有一个特定的View
有一个脏矩形,那么只会绘制那个脏矩形,但由于另一个视图也有一个,所以脏矩形包含两者。