2012-08-11 58 views
21

我把一个Log.d()调用放到我的扩展视图的onDraw()中,所以我可以看到它被调用的频率和时间。它被称为视图的实例化,这并不奇怪。但后来我注意到,即使我的代码没有做任何与图形相关的任何事情,它也会在onTouchEvent()处理的每个tap上调用。然而,在Views的documentation中,我似乎无法找到什么时候onDraw()被实际调用。我并不关心我在这里的特定项目(这对我来说不会造成问题),我只想知道某处是否有列表或显示View的操作顺序的内容,尤其是什么原因onDraw()被调用。当View.onDraw()---它何时被调用?

回答

45

据我所知,一个视图的OnDraw()被调用:

  1. 该视图最初绘制
  2. 每当invalidate()被称为视图上

失效等可能由您或叫系统,只要需要。例如,很多Views会改变它们在Touch上的外观,就像EditText获取轮廓和光标,或者处于按下状态的按钮一样。因此,视图会重新绘制。

我同意拥有一份详细介绍视图工作的文档,如果存在并且有人知道在哪里可以找到它,请告诉我们。

+0

这不适用于'ViewGroup's。请参阅我的答案http ://stackoverflow.com/a/34367199/1642079 – 2016-10-25 17:52:54

7
  • 如果你设置背景绘制的视图,然后在视图将提请 为你回电话给其的onDraw()方法之前。

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

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

+0

是我们可以拦截之前调用回onDraw(),你想检查我的问题http://stackoverflow.com/questions/19052952/bitmap-change-will - 制作 - 视图 - 自动刷新前方的OnDraw中和 - 不管-无效 – VinceStyling 2013-09-28 06:57:51

1

一个重要的事情是,尽量不带参数减少无效()函数调用的。 而是尝试使用四个参数来最大化invalidate()函数。由于整个视图的绘制非常昂贵。第二个变体仅刷新视图的一部分。

8

onDraw()在调用invalidate()时被调用。

但是你应该知道对于ViewGroups:onDraw()不会像你期望的那样被称为。相反,onDispatchDraw()

但是,在ViewGroup中,您可以在构造函数中调用setWillNotDraw(false)以使onDraw()invalidate()上被调用。

看一看this answer

0

附加于上述:软键盘导致View.invalidate() - > View.onDraw()调整窗口大小后序列明智地容纳“键盘” 。自定义View.onDraw()必须使自己处于预期这种可能性的状态。
这种现象解释了为什么在蓝牙键盘的平板电脑上开发和测试的应用程序一旦到达真实世界就会转到狗身上( - :

相关问题