安卓基础:View 绘制

2017-01-19 Piasy 更多博文 » 博客 » GitHub »

安卓开发 基础知识

原文链接 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 之前

Measure 和 Layout 的具体过程

参考文章