Android View绘制流程:Measure/Layout/Draw

本文详细解析了Android视图的绘制流程,包括Measure、Layout和Draw三个阶段。Measure阶段负责测量控件尺寸,Layout阶段负责布局摆放,Draw阶段则进行绘制操作。深入理解这一流程对于自定义视图至关重要。

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

Android View绘制流程:Measure/Layout/Draw


对view绘制流程做一个简单的记录,纯个人笔记。

一.Measure

测量控件:

  1. 递:开始测量,由最顶层的父控件将MeasureSpec(测量布局的规则,包含测量大小和测量模式两种属性)向上传递到子控件,子控件开始测量,子控件根据测量策略计算出自身的MeaseureSpec,继续传递给子子控件,子子控件根据测量策略计算出自身的MeasureSpec,继续传递给子子子控件…,直到最底层控件计算出自身的MeasureSpec。
  2. 归:当最后一级子控件测量好自身的MeasureSpec,调用setMeasuredDimension()将布局属性传递回它的父控件,父控件根据传回来的测量模式及测量大小计算出自己的测量属性
    继续调用setMeasuredDimension()向上传递,直到最顶层的控件完成测量,测量完成。

图析:
measure

二.Layout

控件的布局摆放:
view的layout过程和viewGroup的layout过程有一些不同:viewGroup比view多了一个onLayout摆放子布局位置的操作:

  1. viewGroup:调用layout()后,通过调用setFrame()设定left/top/right/bottom四个位置的值,接着会调用onLayout()方法,在onLayout()遍历所有子控件,通过调用child.layout()对子控件做布局计算,如此反复直到计算设定好最上层view的位置。
  2. view:和viewGroup一样,调用layout()后,通过调用setFrame()设定left/top/right/bottom四个位置的值,接着会调用onLayout()方法,因为在view树中,view已经是处于最上层,不包裹其他view或viewGroup,所以在view中onLayout()是一个空方法,不做任何处理;

三.Draw

绘制:
步骤描述:
* 1. 绘制背景:drawBackground(canvas)
* 2. 保存画布的图层防止褪色
* 3. 绘制view自身:onDraw(canvas)
* 4. 绘制子控件:dispatchDraw(canvas):
* 5. 绘制淡化边缘并恢复图层
* 6. 绘制装饰:如前景、滚动条,onDrawForeground(canvas)
在绘制的过程中,viewGroup除非设置了背景,不然没有绘制的工作,viewGroup的onDraw()也不会调用,但是viewGroup会调用dispatchdraw()绘制子view,直到绘制完最后一层view,整个view树的draw完成。

总结

android view工作原理很简单,是自定义view必须要掌握的知识点,但是很多细节还是要看源码去理解,做个简单记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值