我在扩展的View的onDraw()方法中放置了一个Log.d()调用,以便查看它被调用的频率和时间。它在视图实例化时被调用,这并不奇怪。但是我注意到,它在每次由onTouchEvent()处理的触摸操作中都会被调用,尽管我的代码与图形完全无关。然而,在Views的文档中,我似乎找不到有关onDraw()何时被调用的任何信息。我并不真正关心我的特定项目(这对我没有问题),我只想知道是否有某个列表或类似的东西显示View的操作顺序,特别是是什么导致onDraw()被调用。
我在扩展的View的onDraw()方法中放置了一个Log.d()调用,以便查看它被调用的频率和时间。它在视图实例化时被调用,这并不奇怪。但是我注意到,它在每次由onTouchEvent()处理的触摸操作中都会被调用,尽管我的代码与图形完全无关。然而,在Views的文档中,我似乎找不到有关onDraw()何时被调用的任何信息。我并不真正关心我的特定项目(这对我没有问题),我只想知道是否有某个列表或类似的东西显示View的操作顺序,特别是是什么导致onDraw()被调用。
据我所知,当以下情况之一发生时,View的onDraw()方法会被调用:
无论何时需要,您或系统都可以调用invalidate()方法。例如,许多视图在触摸操作时改变外观,如EditText获取轮廓和光标,按钮处于按下状态等。由于这个原因,视图在触摸上重新绘制。
我同意有一个详细介绍视图工作方式的文档将是很好的,如果有人知道其中之一的存在并且知道如何找到它,请告诉我们。
ViewGroup
。请参见我的答案 https://dev59.com/RGct5IYBdhLWcg3wqfP9#34367199 - Chad BinghamonDraw()
方法不能保证在invalidate()
之后立即被调用。正如文档所述,如果视图可见,则onDraw(android.graphics.Canvas)
方法将在未来的某个时间点被调用。 - Sơn PhanonDraw()
方法在调用invalidate()
时被调用。
但你需要知道对于ViewGroups,onDraw()
不会像你期望的那样被调用。相反,onDispatchDraw()
方法会被调用。
然而,在ViewGroup中,你可以在构造函数中调用setWillNotDraw(false)
使得onDraw()
方法在调用invalidate()
时被调用。
请参考这个答案
记住一件重要的事情,尽量减少不带参数调用invalidate()函数。相反,尽量最大化使用带有四个参数的invalidate()函数。因为绘制整个视图非常昂贵。第二种方法只会刷新视图的一部分。
什么时候会调用onDraw方法(请查看this以获取更多详细信息)
当Android认为您的视图应该重新绘制时,将调用onDraw方法。这可能是在动画过程中,每帧都会调用onDraw方法。当布局发生更改并且您的视图在屏幕上重新定位时,也会调用它。
但是,如果您的视图内部的某些数据已更改,并且您想确保视图被重新绘制,则不能直接调用onDraw方法。相反,您应该调用invalidate方法,告诉视图它需要重新绘制自己。
View
可以通过从 XML 布局中进行膨胀或直接从代码中构建来创建。当onFinishInflate
完成时,尚未知道任何测量值,只有当View
实际“渲染”时才会计算它们(即当onAttachedToWindow
、onMeasure
、onLayout
和onDraw
被调用时)。 - samus