android layout,measure,draw资料收集

来源:互联网 发布:百知java培训 编辑:程序博客网 时间:2024/04/28 16:30
写在前面,本文对网络中一些关注标题的文章进行了下收集总结,旨在知道每个函数的意义,特别是requestLayout和invalidate这两个比较常用函数的区别。

首先放一张大神图
感觉不需要过多解释了。

然后看过一些相关代码的都知道有个ViewRootImpl的玩意儿,然后invalidate或者requestLayout都是发消息,然后最终触发一个超级长的函数:performTraversals。许多分析都很长,估计都看晕了,这个函数简短来说就是干了这么些活:

收集了两张图,表达了同一个意思。也不多说了。


在之后收集的文章中,有人提问为什么TextView需要先invalidate然后再requestLayout,requestLayout不是包含了invalidate吗,或者在addView的时候为什么requestLayout会调用两次(外部调一遍,子函数又调一遍)
首先要知道上次函数都是通过发消息的方式执行,而不是直接进行的。然后最终都是通过performTravesal函数来执行的。所以在发消息的时候通过标志位的设置来决定最后需不需要刷新之类的。再来就是父容器的标志位可以阻断子节点的刷新,因为父容器都刷了,子节点必然会刷新,所以调两次之类的其实可以省了一些消息发送。具体看我最后的参考资料吧

参考资料:

Usage of forceLayout(), requestLayout() and invalidate()
Android requestLayout 和 invalidate

以下两篇比较长,在讲最复杂的view绘制流程,楼主太懒没怎么看
Android中View绘制流程以及invalidate()等相关方法分析
Android应用层View绘制流程与源码分析 

这两篇主要是讲我刚才说的问题,讲的比我清楚。我懒得码字 
addView 源码调用顺序的迷惑
调用ViewGroup的addView之后,是怎样显示出来的?


0 0
原创粉丝点击