View.invalidate()似乎没有调用View.onDraw()

时间:2012-04-13 21:54:13

标签: android invalidation

我有一个绘图库,有了它我有一个自定义视图。当需要进行任何更新时,库会调用视图的invalidate()方法。然后调用onDraw()方法,一切正常。

但是,当我将usesSdkVersion="14"的属性添加到AndroidManifest.xml file时,这将停止工作。我的视图onDraw()方法不再被调用了。

更多信息: 似乎当我在我的应用程序中按下按钮时调用invalidate()时,View会按预期更新。此外,我的库中有一个动画正常工作。所以显然有时它工作正常。但大部分时间,都没有重新绘制。是否存在自定义视图可能导致操作系统在调用invalidate()后跳过重绘的状态?

3 个答案:

答案 0 :(得分:5)

从android 3.0开始,当使用硬件加速时,视图的绘制将被记录并存储在GPU中。

所以当你有两个观点时:A在B之上,你调用B.invalidateB.onDraw将被调用并记录到GPU,但A.onDraw将不会被调用,因为它已经记录!

当调用所有视图onDraw时,这与非硬件加速模式不同。

答案 1 :(得分:2)

官方文件:

但是,由于所有2D绘图操作都不支持硬件加速,因此打开它可能会影响某些使用自定义视图或绘图调用的应用程序。问题通常表现为不可见的元素,异常或错误渲染的像素。

要解决此问题,Android会为您提供在以下级别启用或禁用硬件加速的选项:

<强>应用

<application android:hardwareAccelerated="true" ...>

<强>活动

<application android:hardwareAccelerated="true">
  <activity ... />
  <activity android:hardwareAccelerated="false" />
</application>

<强>窗口

  

getWindow()。setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

查看

  

myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

我在我看来测试。

答案 2 :(得分:2)

这似乎是Android中的一个错误。而不是 invalidate()尝试使用具有四个参数的相同名称的方法:

view.invalidate(0,0,view.getWidth(), view.getHeight());

顺便说一下,最好只使那个正在变化的区域失效。通过无效区域的左,上,右,下坐标。