Android View的绘制流程

本文详细解析了Android UI的绘制流程,包括测量、布局和绘制三个关键步骤。介绍了MeasureSpec的作用及不同模式的特点,深入探讨了DecorView如何利用MeasureSpec进行测量,并解释了ViewGroup和View在绘制过程中的职责。

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

首先,Android UI管理系统的层级关系为:activity{phoneWindow[decorView(titleview,contentview)]},phonewindow是activity中最基本的窗口系统,是activity和view交互的接口,decorview本质上是一个framelayout,包含了titleview和contentview

绘制首先是从根视图viewroot的performtraversals方法开始的,每个view负责绘制自身,viewgroup不光负责绘制自身,还需要负责通知自己的子view进行绘制。

绘制的过程分为三个步骤:测量measure、布局layout和绘制draw

测量模式measurespec有三种,分布是UNSPECIFIED不指定测量模式、EXACTILY精确测量模式和AT_MOST最大值模式,unspecified模式父视图没有限定子视图的大小,exactily模式当视图的layoutWidth或者layoutHeight指定为具体的数值时生效,表示父视图已经决定了子视图的精确大小,这时候view的测量值就是specsize的值,atmost模式当视图的layoutwidth或者layoutheight指定为wrapcontent时生效,此时子视图的尺寸可以是不超过父视图允许的最大尺寸的任意尺寸

对于decorview来说,它的measurespec由窗口尺寸和自身的layoutparams决定,对于普通的view来说,它的measurespec由父视图的measurespec和自身的layoutparams共同决定

measure:用来计算view的实际大小,测量流程从performMeasure开始,具体的测量操作分发给viewgroup,由viewgroup在它的measureChild方法中传递给子view,viewgroup遍历自身所有的子view,并逐个调用子view的measure方法实现测量操作。通过自定义view实现view或者viewgroup,重写onmeasure方法来实现测量,用setMeasureDimension方法设置view的测量宽高,如果自定义view没有重写onmeasure方法,则默认调用getDefaultsize方法来获得view的宽高

layout:用来确定view在父容器中的布局位置,是由父容器获取子view的位置参数后,调用子view的layout方法并将位置参数传递过去实现的。子类如果是viewgroup,则重写onlayout方法,实现viewgroup中所有的view控件的绘制流程

draw:用来将控件绘制出来,绘制基本上分为六个步骤:1、绘制view的背景drawBackground;2、如果需要的话,保存canvas图层;3、绘制view的内容;4、绘制view的子view,dispatchDraw;5、如果需要的话,绘制view的pading边缘并恢复图层;6、绘制view的装饰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值