ViewRoot和DecorView简述

本文详细解析了Android系统中View的绘制流程,包括measure、layout和draw三个阶段的工作原理及其实现过程。measure阶段确定View的宽高,layout阶段确定View的位置与实际大小,而draw阶段则负责将View绘制到屏幕上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android系统中,ViewRoot对应于ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大流程(measure、layout、draw)都是通过ViewRoot来完成的。
在Activity对象被创建完毕后,会将DecorView添加到Window中。同时,会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联。

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

View的绘制流程是从ViewRoot的performTraversals方法开始的,它经过measure、layout、draw三个流程,最终才可以将这个view绘制出来。

measure: 负责测量view的宽度 和 高度;
layout: 负责确定view在父容器中的位置;
draw: 负责将view绘制在屏幕上。

performTraversals的大致流程如图所示。
ViewRoot和DectorView

如图所示,performTraversals时会依次调用performMeasure、performLayout和performDraw。这三个方法会完成View的measure、layout和draw三个流程。
performMeasure会内在调用measure方法,measure方法实质上又会调用onMeasure方法,在onMeasure方法方法里面对所有的子元素进行测量操作。之后measure的流程就会从父容器传递到子元素中了,这样 就完成了一次measure操作。子元素也会重复父容器中的measure操作,如是反复就完成了View树的遍历。同理,performLayout和performDraw的实现原理也是这样的。

1)measure过程决定了View的测量后的宽度/高度,measure过程完成之后,就可以通过getMeasuredWidth和getMeasuredHeight方法来获取View的测量宽度/高度;
2)layout过程决定了View的四个顶点的位置和实际的View的宽度和高度。完成之后,可以通过getTop/getBottom/getLeft/getRight获取四个顶点的位置,并且可以通过getWidth/getHeight获取View的最终高度/宽度。
3)draw过程则决定了View的显示,只有draw方法完成后我们才可以在屏幕上看到View。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值