7

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

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

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

4

3 回答 3

6

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

所以当你得到两个视图时:A 在 B 之上,你调用B.invalidate,B.onDraw将被调用并记录到 GPU,但A.onDraw不会被调用,因为它已经记录了!

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

于 2012-07-22T06:58:14.333 回答
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);

我在我看来测试。

于 2013-12-11T13:43:12.730 回答
2

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

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

顺便说一句,更好的做法是仅使正在变化的那个区域无效。传递无效区域的左、上、右、下坐标。

于 2015-05-24T11:20:02.813 回答