我有一个绘图库,有了它我有一个自定义视图。当需要进行任何更新时,库会调用视图的invalidate()
方法。然后调用onDraw()
方法,一切正常。
但是,当我将usesSdkVersion="14"
的属性添加到AndroidManifest.xml file
时,这将停止工作。我的视图onDraw()
方法不再被调用了。
更多信息:
似乎当我在我的应用程序中按下按钮时调用invalidate()
时,View会按预期更新。此外,我的库中有一个动画正常工作。所以显然有时它工作正常。但大部分时间,都没有重新绘制。是否存在自定义视图可能导致操作系统在调用invalidate()
后跳过重绘的状态?
答案 0 :(得分:5)
从android 3.0开始,当使用硬件加速时,视图的绘制将被记录并存储在GPU中。
所以当你有两个观点时:A在B之上,你调用B.invalidate
,B.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());
顺便说一下,最好只使那个正在变化的区域失效。通过无效区域的左,上,右,下坐标。