View.onDraw()---什么时候被调用?

Cpt*_*rkt 29 graphics android ondraw

我将一个Log.d()调用放入我的扩展视图的onDraw()中,这样我就可以看到它被调用的频率和时间.它在实例化视图时被调用,这并不奇怪.但后来我注意到,它会在onTouchEvent()处理的每个tap上被调用,即使我的代码没有做与图形远程相关的任何事情.但是,在Views 的文档中,我似乎无法找到关于何时实际调用onDraw()的任何内容.我并不是真的关心我的特定项目(这不会对我造成问题),我只想知道某个地方是否有列表或显示View的操作顺序,特别是导致onDraw()被调用.

Rag*_*ood 55

AFAIK,View的onDraw()在以下情况下被调用:

  1. 该视图最初是绘制的
  2. 每当在视图上调用invalidate()时

无论何时需要,您或系统都可以调用Invalidate.例如,很多视图会改变它们在onTouch上的外观,例如获取轮廓和光标的EditText,或处于按下状态的按钮.因此,视图会在触摸时重新绘制.

我同意如果有一份详细说明Views工作的文档会很好,如果有人知道在哪里找到它,请告诉我们.


Cha*_*ham 14

onDraw()调用时invalidate()调用.

但是你应该知道ViewGroups:onDraw()不会像你期望的那样被调用.相反,onDispatchDraw().

但是,在ViewGroup中,您可以调用setWillNotDraw(false)构造函数来onDraw()调用它invalidate().

看看这个答案


has*_*ian 8

  • 如果为View设置了一个可绘制的背景,那么View会在回调它的onDraw()方法之前为你绘制它.

  • 当视图附加到窗口时,将调用onAttachedToWindow().此时它有一个Surface并将开始绘制.请注意,保证在onDraw(android.graphics.Canvas)之前调用此函数,但是可以在第一次onDraw之前的任何时间调用它 - 包括onMeasure(int,int)之前或之后.

  • invalidate()将dirty定义的区域标记为需要绘制.如果视图可见,将在某个时间点调用onDraw(android.graphics.Canvas).