View的绘制流程

写在前面

记录View的绘制流程,首先先看看下面这张图。

View的绘制流程_第1张图片
view_measure.png

由此可看出:

  1. 展示在用户眼前的界面的显示包含关系是Activity(PhoneWindows(DecorView(TitleView,ContentView))),TitleView就是ActionBar的父容器,ContentView就是我们的更布局R.id.content,并且每个Activity都关联着一个Window(实际上是其实现类PhoneWindow)。
  1. 用户界面是由Window承载的,从开发者的角度去看问题,先从setContentView()方法开始,最终调用的其实是getWindow().setContentView(),在PhoneWindow中的setContentView()方法中通过inflate()方法解析,最终的inflate()会传入XmlPullParser和ViewGroup进行对xml解析(XmlPullParser就是我们所熟悉的其中的一种xml解析方式,可能这就是google推荐使用pull的原因)。
  2. 然而setContentView()只是完成了界面的创建和配置,View的绘制还没开始呢。
  3. 事实上View的绘制是由ViewRoot完成的(其实现类是ViewRootImpl),每个DecorView都是通过ActivityManager关联的(在Activity启动时,也就是在ActivityThread.handlerResumeActivity()中建立的关联的)
  4. DecorView与ViewRoot建立关联后,就调用了ViewRootImpl中的requestLayout方法,在其内部会执行measure(计算View的宽高)、layout(定义View的位置)、draw(开始绘制:绘制背景、绘制scollbar等)方法

写在最后 :

附上View绘制函数调用链

View的绘制流程_第2张图片
view_draw.png

你可能感兴趣的:(View的绘制流程)