安卓基础:View 绘制
原文链接 http://blog.piasy.com/2017/01/19/Android-Basics-View-draw-procedure/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
View 树的绘图流程
当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 framework 处理。
整个 View 树的绘图流程在ViewRoot.java类的performTraversals()函数展开,该函数所做 的工作可简单概况为是否需要重新计算视图大小(measure)、是否需要重新安置视图的位置(layout)、以及是否需要重绘(draw),流程图如下:
View 绘制流程函数调用链
有几点注意:
- invalidate/postInvalidate 只会触发 draw;
- requestLayout,会触发 measure、layout 和 draw 的过程;
- 它们都是走的
scheduleTraversals -> performTraversals
,用不同的标记位来进行区分; - resume 会触发 invalidate;
- dispatchDraw 是用来绘制 child 的,发生在自己的 onDraw 之后,child 的 draw 之前