ViewRoot和DecorView

在介绍VIew的三大流程之前,我们先介绍一些基本概念,以便更好的理解View的measure、layout、draw过程,这里介绍VIewRoot和DecorView。
1.ViewRoot
是应于ViewRootImpl类,它连接VIewManager和Decor View。View的三大流程,是通ViewToot來完成。在ActivityThread中,当Activity对象被创建完毕后,会将DecorView添加到Window中,同时创建ViewRootImpl对象,并将ViewRootImpl对象和Decor View建立关联,源码如下:

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

View的绘制流程是从ViewRoot的performTraversals方法开始,经过measure、layout和draw三个过程才能将一个View绘制出来,其中measure 用来测量View的宽高,layout用来确定View在父容器中的位置,而draw复制绘制View到屏幕上。performTraversals的工作流程如下:
在这里插入图片描述
如上图,performTraversals会依次调用performMuasure、performLayout和performDraw三个方法,这三个方法别分在顶级View完成measure、layout和draw三大流程。其中,performMeasure中会调用measure,在measure中会调用onMeasure方法对所有的子元素进行measure过程。这个measure就从父容器传递到子元素中了,如此反复,就遍历了整个View。同理,performLayout和performDraw和performMuasure类似,不同的是performDraw的传递过程是在draw中调用dispatchDraw实现的,但本质上没有区别。
measure确定View宽高,Measure完成后,可以通过getMeasuredWidth和getMeasuredHeight方法获取View测量后的宽高,在几乎所有的情况下,它都等同于View最终的宽高,特殊情况除外。
Layout过程,决定了View的四个顶点的坐标和实际的view的宽高,完成后,可以通过getTop、getBottom、getLeft、和getRight拿到View的四个顶点位置。并通过getWidth和getHeight获取View最终的宽高。
Draw负责View的显示,只有draw方法完成后,View的内容才会显示在屏幕。
2.Decor View
DecorView作为顶级View,一般情况内部会包含一个竖直方向的Linear Layout,在这个LinearLayout里面有上下两部分,标题栏和内容栏,内容栏中我们用setContentView设置布局文件,而内容栏的id是content,可以用ViewGroup content = findViewById(R.android.id.content).如何得到View,可以这样:content.getChildAt(0).通过源码可以知道,DecorView 其实是一个Framelayout,View层的事件都先经过DecorView,然后才到View。
在这里插入图片描述
特别声明:内容总结来源《Android开发艺术探索》,仅记录学习,如有侵权或不对之处,还请告知,定当删除或改正

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个Bug有点难搞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值