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

写在开头: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树的遍历。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值