Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android View.invalidate()似乎没有调用View.onDraw()_Android_Invalidation - Fatal编程技术网

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

Android View.invalidate()似乎没有调用View.onDraw(),android,invalidation,Android,Invalidation,我有一个图形库,并且有一个自定义视图。当需要进行任何更新时,库调用视图的invalidate()方法。然后调用onDraw()方法,一切正常 但是,当我将usesSdkVersion=“14”的属性添加到我的AndroidManifest.xml文件中时,这将停止工作。我的视图的onDraw()方法不再被调用 更多信息: 似乎当我在应用程序中按下按钮后调用invalidate()时,视图会按预期更新。另外,我的库中有一个动画工作正常。所以很明显,有时它工作正常。但大多数时候,它并没有被重新绘制。

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

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

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

来自android 3.0,当使用硬件加速时,视图的绘制会被记录并存储在GPU上

因此,当您得到两个视图时:A位于B之上,并且您调用
B.invalidate
B.onDraw
将被调用并记录到GPU,但是
A.onDraw
将不会被调用,因为它已经被记录了

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

官方文件:

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

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

应用程序


活动


窗口

getWindow().setFlags(WindowManager.LayoutParams.FLAG\u HARDWARE\u ACCELERATED,WindowManager.LayoutParams.FLAG\u HARDWARE\u ACCELERATED)

查看

myView.setLayerType(View.LAYER\u TYPE\u软件,空)


我在我看来是在测试。

这似乎是安卓系统中的一个bug。尝试使用具有四个参数的同名方法,而不是invalidate():

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

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

你还在从UI线程调用它吗?否则您必须使用postInvalidate()。我尝试将invalidate更改为postInvalidate只是为了检查这一点,但问题仍然存在。硬件加速是打开还是关闭?我将minSdkVersion更改为11,以便可以显式将hardwareAccelerated属性设置为“false”,这个问题仍然存在。回答:所以我不得不在另一个视图上调用
invalidate()
。在更改
AndroidManifest.xml
文件之前,不必这样做。
<application android:hardwareAccelerated="true">
  <activity ... />
  <activity android:hardwareAccelerated="false" />
</application>
view.invalidate(0,0,view.getWidth(), view.getHeight());