我的应用程序中有一个自定义视图,用于填充整个活动。
在大多数情况下,当我想刷新控件时,我调用invalidate()
而没有任何参数。
但是,在某些情况下,我只更改控件的一小部分区域,我会调用invalidate(Rect)
以避免重新绘制整个屏幕。这很重要,因为在这些情况下我
需要更新尽可能快。
这似乎工作正常,但是,当我在Honeycomb中启用硬件加速(即在AndroidManifest.xml中设置android:hardwareAccelerated="true"
)时,部分重绘似乎不起作用。
如果我在Log.d("FOO", canvas.getClipBounds())
方法中onDraw()
,可以看到这一点;输出只显示整个控件正在更新,而禁用硬件加速,我得到正确的区域输出。
使用硬件加速时有没有办法使部分失效工作?
非常感谢,马特
答案 0 :(得分:15)
部分重绘工作正常,只有屏幕的指定区域才会被重绘。然而,它不会改变画布上的剪辑边界。将记录所有绘图操作,但实际上只会执行与脏区域相交的那些操作。
更新:从Lollipop(API 21)开始,部分失效发生在视图级别(即,您不能使整个视图无效)。
答案 1 :(得分:1)
启用HA后,渲染管道将使用DisplayList
存储绘图命令。即使您在View.invalidate
中指定了脏区域,也会重建整个显示列表(只是想想我们怎样才能更新一小组DisplayList,这是不可能的?)。最终,作为@Romain
说,只有真正的脏区域才会重新绘制。