安卓:无效(脏)(Android: invalidate(dirty))

2019-08-04 23:39发布

好像还真的Android不喜欢invalidate (Rect dirty) ,这是用来无效画布的一部分。 当我一个无效的帆布部分(在下面绿色显示)和一个ToggleButton需要在同一时间重绘的画布之外 ,以红色显示,整个区域将被删除! 它好像Android是刚刚无效的最小的矩形包含了需要重新绘制的两个区域的工会内部的一切,即使区域之一是其帆布我无效视图之外。

这是标准的行为,如果是这样,为什么会有人使用部分无效?

Answer 1:

Android有一类称为ViewRootImpl 。 此类由每次你在屏幕上看到的窗口拥有(的词窗口有点迷惑在这里,所以对此的解释窗口是没有在上面任何对话框或弹出窗口的主要活动的布局)。 这种布局正在遍历所有的时间,这意味着Android的只是等待有此窗口脏矩形,并绘制它。 由于这个窗口可以包含多个视图(按钮等),它通过所有的人,并要求每一个它是否需要重绘。 每个视图返回一个脏矩形ViewRootImpl和所有这些矩形被接合到在结束重画一个大的矩形。

为什么会这样? 好了, ViewRootImpl询问WindowManagerService一个Canvas上绘制。 这意味着,在一个窗口中的所有观点实际上是共用一个Canvas ,每次有一个遍历。

至于你的问题,如果只有一个特定View过脏矩形则只有肮脏的矩形将绘制,但由于另一种观点有一个还有那么脏矩形包含两种。



Answer 2:

此问题是由硬件加速造成的。 您必须在活动中才能使用禁用invalidate(dirty rect) 。 要在活动禁用硬件加速打开清单文件并添加:

android:hardwareAccelerated="false"

现在,您可以使用invalidate(dirty rect)



文章来源: Android: invalidate(dirty)