我把一个Log.d()调用放到我的扩展视图的onDraw()中,所以我可以看到它被调用的频率和时间。它被称为视图的实例化,这并不奇怪。但后来我注意到,即使我的代码没有做任何与图形相关的任何事情,它也会在onTouchEvent()处理的每个tap上调用。然而,在Views的documentation中,我似乎无法找到什么时候onDraw()被实际调用。我并不关心我在这里的特定项目(这对我来说不会造成问题),我只想知道某处是否有列表或显示View的操作顺序的内容,尤其是什么原因onDraw()被调用。当View.onDraw()---它何时被调用?
回答
据我所知,一个视图的OnDraw()被调用:
- 该视图最初绘制
- 每当invalidate()被称为视图上
失效等可能由您或叫系统,只要需要。例如,很多Views会改变它们在Touch上的外观,就像EditText获取轮廓和光标,或者处于按下状态的按钮一样。因此,视图会重新绘制。
我同意拥有一份详细介绍视图工作的文档,如果存在并且有人知道在哪里可以找到它,请告诉我们。
如果你设置背景绘制的视图,然后在视图将提请 为你回电话给其的onDraw()方法之前。
onAttachedToWindow()在视图附加到窗口时调用。 在这一点上它有一个表面,并将开始绘制。请注意,这个 函数保证在 onDraw(android.graphics.Canvas)之前被调用,但是它可以在第一个onDraw之前 - 包括onMeasure之前或之后(int, int)之前的任何时间被调用 。
invalidate()将dirty定义的区域标记为需要绘制。如果 视图可见,onDraw(android.graphics.Canvas)将在 未来的某个点调用。要牢记
是我们可以拦截之前调用回onDraw(),你想检查我的问题http://stackoverflow.com/questions/19052952/bitmap-change-will - 制作 - 视图 - 自动刷新前方的OnDraw中和 - 不管-无效 – VinceStyling 2013-09-28 06:57:51
一个重要的事情是,尽量不带参数减少无效()函数调用的。 而是尝试使用四个参数来最大化invalidate()函数。由于整个视图的绘制非常昂贵。第二个变体仅刷新视图的一部分。
onDraw()
在调用invalidate()
时被调用。
但是你应该知道对于ViewGroups:onDraw()
不会像你期望的那样被称为。相反,onDispatchDraw()
。
但是,在ViewGroup中,您可以在构造函数中调用setWillNotDraw(false)
以使onDraw()
在invalidate()
上被调用。
看一看this answer
附加于上述:软键盘导致View.invalidate() - > View.onDraw()调整窗口大小后序列明智地容纳“键盘” 。自定义View.onDraw()必须使自己处于预期这种可能性的状态。
这种现象解释了为什么在蓝牙键盘的平板电脑上开发和测试的应用程序一旦到达真实世界就会转到狗身上( - :
- 1. MPMoviePlayerPlaybackDidFinishNotification被调用时,它不
- 2. View.invalidate()似乎没有调用View.onDraw()
- 3. 为什么onActivityResult()在调用它的人为null时被调用?
- 4. applicationWillUpdate何时被调用?
- 5. Netty Framework:channelOpen何时被调用?
- 6. encodeWithCoder何时被调用?
- 7. heightForHeaderInSection何时被调用
- 8. viewWillAppear何时被调用?
- 9. AsyncController回调没有被调用,如何调用它?
- 10. iOS在哪里定义了applicationWillEnterBackground?它何时被调用?
- 11. onNavigationItem被选中的ActionBar在启动时被调用如何避免它?
- 12. 有时服务被调用,有时它不会
- 13. mousePove被调用时未调用mouseMove
- 14. thread.join()被调用,它不是我
- 15. OnReceive未被调用,因为它应该
- 16. 在Android中,何时接口被调用?
- 17. 何时实例init块被调用?
- 18. AsyncTask何时onPostExecute()未被调用?
- 19. Marrionette ItemView onClose方法何时被调用?
- 20. searchDisplayController委托方法何时被调用?
- 21. 为什么加入时,它不会被调用
- 22. 当在FOR循环之前调用Settext时,它不会被调用
- 23. Response.Cookies在RedirectToAction被调用时被重置
- 24. ajax再次被调用时被跳过?
- 25. 第二个javascript被第一个javascript调用时,它没有被执行
- 26. drawRect被调用,但它内部的代码在运行时没有被执行?
- 27. 当j_security_check被调用时,哪个登录模块被WebSphere调用?
- 28. 启用EditText OnClick时,它已被禁用
- 29. 如何使用getView()方法以及它在哪里被调用?
- 30. $ .ajax使API调用两次,尽管它只被调用一次
这不适用于'ViewGroup's。请参阅我的答案http ://stackoverflow.com/a/34367199/1642079 – 2016-10-25 17:52:54