自定义Android视图中的硬件加速部分失效

时间:2011-08-29 17:53:55

标签: android

我的应用程序中有一个自定义视图,用于填充整个活动。

在大多数情况下,当我想刷新控件时,我调用invalidate()而没有任何参数。

但是,在某些情况下,我只更改控件的一小部分区域,我会调用invalidate(Rect)以避免重新绘制整个屏幕。这很重要,因为在这些情况下我 需要更新尽可能快。

这似乎工作正常,但是,当我在Honeycomb中启用硬件加速(即在AndroidManifest.xml中设置android:hardwareAccelerated="true")时,部分重绘似乎不起作用。

如果我在Log.d("FOO", canvas.getClipBounds())方法中onDraw(),可以看到这一点;输出只显示整个控件正在更新,而禁用硬件加速,我得到正确的区域输出。

使用硬件加速时有没有办法使部分失效工作?

非常感谢,马特

2 个答案:

答案 0 :(得分:15)

部分重绘工作正常,只有屏幕的指定区域才会被重绘。然而,它不会改变画布上的剪辑边界。将记录所有绘图操作,但实际上只会执行与脏区域相交的那些操作。

更新:从Lollipop(API 21)开始,部分失效发生在视图级别(即,您不能使整个视图无效)。

答案 1 :(得分:1)

启用HA后,渲染管道将使用DisplayList存储绘图命令。即使您在View.invalidate中指定了脏区域,也会重建整个显示列表(只是想想我们怎样才能更新一小组DisplayList,这是不可能的?)。最终,作为@Romain 说,只有真正的脏区域才会重新绘制。