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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值