View那些事儿(1) -- View绘制的整体流程

来源:互联网 发布:java语言 编辑:程序博客网 时间:2024/05/29 17:23
写在开头:Android的知识体系十分庞大,在Android的学习道路上难免会遇到学习了新东西就忘了旧东西的情况,本系列文章主要是对自己对View的学习过程进行一个深入的理解与总结,当然还结合自己在实际项目中的一些体会写了一些东西。

当用户打开你写出的App的时候,第一眼关注到的是整个界面,而不是功能,所以要想吸引住用户,就必须写出一个好看的界面。好在Android提供了一套强大的绘图体系,让我们可以自由发挥,绘制出形形色色的View,从而构成丰富多彩的界面。不过要想掌握绘图技巧,就必须掌握View的工作原理,我们就从View的最基本的原理开始探索吧。
先来看看一个窗口由那些部分组成的:
Android窗口的组成

接着解释一下这些View的意义:

  • PhoneWindow:将Decoriew设置为整个应用窗口的根View,是Window的实现类,它是Android中的最基本的窗口;
  • DecorView:又叫顶级View,系统会将要显示的具体内容呈现在PhoneWindow上。一般情况下,它的内部会包含一个竖直方向的LinearLayout,在这个layout中有两个部分:title和content,DecorView可以通过 View view = getWindow().getDecorView()获得。它还是PhoneWindow与ViewRoot之间的桥梁,ViewRoot会通过DecorView设置窗口属性;
  • DecorView中的TitleView:标题栏,一般指的是toolbar。
  • DecorView中的ContentView:内容栏,是一个id为content的Framelayout,我们平时所写的setContentView()其实就是在设置它。

上面提到了ViewRoot,那么ViewRoot又是什么呢?
我们要知道,View的绘制有三大流程:measure(测量)、layout(布局)、draw(绘制),其中measure用来测量view的宽和高,layout用来确定view在父容器中位置,而draw则负责将view绘制在屏幕上。这里的三大流程均是通过ViewRoot来完成的,ViewRoot的实现类是ViewRootImp。在ActivityThread中,当Activity对象被创建完毕后,会将DecorView添加到Window中,同时创建ViewRootImp对象,并将ViewRootImp和DecorView建立关联,源码中中片段如下:

root = new ViewRootImp(view.getContext(),display);root.setView(view,wparams,panelParentView);

View的绘制流程是从ViewRoot的performTraversals()方法开始的,其过程如下图所示:

performTraversals的工作流程

performTraversals()会依次调用performMeasure、performLayout和performDraw,这三个方法分别完成以上三大流程,例如performMeasure会调用measure方法,measure方法中又会调用onMeasure方法,在onMeasure方法中会对所有子view进行measure过程,子view再重复此过程,如此反复就实现了view树的遍历。

原创粉丝点击