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