我在扩展视图的onDraw()中放置了一个Log.d()调用,这样我就可以看到它被调用的频率和时间。 它在实例化视图时被调用,这并不奇怪。 但后来我注意到,每次点击 onTouchEvent() 都会调用它,即使我的代码在那里没有做任何与图形远程相关的事情。 但是,在视图的文档中,我似乎找不到有关何时实际调用onDraw()的任何信息。 我在这里并不真正关心我的特定项目(这不会给我带来问题),我只想知道某处是否有一个列表或显示视图操作顺序的东西,特别是是什么导致 onDraw() 被调用。
AFAIK,在以下情况下调用视图的 onDraw():
- 最初绘制视图
- 每当在视图上调用 invalidate() 时
您可以或系统在需要时调用 Invalid。例如,许多视图会改变它们在触控上的外观,例如 EditText 获取轮廓和光标,或者按钮处于按下状态。因此,视图在触摸时重新绘制。
我同意有一个详细说明 View 工作的文档会很好,如果存在并且有人知道在哪里可以找到它,请告诉我们。
invalidate()
时调用onDraw()
。
但是你应该知道ViewGroups:onDraw()
不会像你期望的那样被调用。相反,onDispatchDraw()
.
但是,在 ViewGroup 中,您可以在构造函数中调用setWillNotDraw(false)
,以使onDraw()
在 invalidate()
上调用。
看看这个答案
如果为视图设置了背景可绘制对象,则将绘制视图 在回调它的 onDraw() 方法之前,它会为你服务。
onAttachedToWindow () 在视图附加到窗口时调用。 此时,它有一个 Surface,将开始绘制。请注意,这 函数保证在之前被调用 onDraw(android.graphics.Canvas),但可以随时调用 在第一个 onDraw 之前 -- 包括在 onMeasure(int, int)。
invalidate() 将脏定义的区域标记为需要绘制。如果 视图是可见的,onDraw(android.graphics.Canvas) 将被调用 未来的某个时候。
要记住的一件重要事情是,尽量减少对没有参数的 invalidate() 函数的调用。相反,尝试使用四个参数最大化 invalidate() 函数。由于绘制整个视图非常昂贵。第二个变体仅刷新视图的一部分。
何时调用 onDraw(查看此内容以获取更多详细信息)
每当安卓认为你的视图时,就会调用onDraw方法。应该重绘。当您的视图是动画时,这可能是这种情况,在为动画中的每一帧调用哪种情况 onDraw。是的当布局更改且视图重新定位时也称为屏幕。
但是,如果视图中的某些数据已更改,并且您希望确保视图已重绘。您不能直接调用 onDraw。相反,您应该调用 invalidate 来告诉视图它需要重绘自身。
除此之外:软键盘在调整窗口大小以合理地容纳"键盘"后,会导致 View.invalidate()-->View.onDraw() 序列。自定义 View.onDraw() 必须使自身处于预期这种可能性的状态。
这种现象解释了为什么您在带有蓝牙键盘的平板电脑上开发和测试的应用程序一旦到达现实世界就会被狗(-: