Android View 测量源码深度解析:PerformTraversals与Measure流程
46 浏览量
更新于2024-08-30
收藏 136KB PDF 举报
"本文将深入解析Android视图(View)的测量(Measure)流程,基于Android API 21的源代码进行分析。"
在Android应用开发中,View的显示过程包括测量(Measure)、布局(Layout)和绘制(Draw)三个主要步骤。`ViewRootImpl#performTraversals`方法是整个视图更新的核心,它触发了这三个步骤,使得屏幕上的UI得以更新。本文将主要关注测量流程,探讨`performMeasure`方法的工作原理。
首先,我们从`performTraversals`方法中的`performMeasure`开始。这个方法的主要任务是对View树进行测量,以确定每个View的大小。在源码中,`getRootMeasureSpec`方法被用来创建根视图(通常是DecorView)的测量规格(MeasureSpec)。测量规格包含两个部分:模式(mode)和大小(size)。模式有三种类型:EXACTLY(精确)、AT_MOST(最大)和UNSPECIFIED(未指定)。它们分别对应于布局参数中的match_parent、wrap_content和无限制。
```java
int childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width);
int childHeightMeasureSpec = getRootMeasureSpec(mHeight, lp.height);
```
这里的`mWidth`和`mHeight`代表父视图可提供的宽度和高度,`lp.width`和`lp.height`是 DecorView 的 LayoutParams 中指定的宽度和高度。`getRootMeasureSpec`根据这些值生成相应的MeasureSpec。
`performMeasure`方法会递归地遍历View树,对每个View进行测量。每个View在测量时会调用自己的`onMeasure`方法,此方法需要按照测量规格计算自己的尺寸,并通过`setMeasuredDimension`设置。对于自定义View,开发者通常需要重写`onMeasure`来定义尺寸计算逻辑。
```java
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 自定义的测量逻辑
int desiredWidth = ...;
int desiredHeight = ...;
setMeasuredDimension(desiredWidth, desiredHeight);
}
```
在这个过程中,View会根据自身的大小需求和父视图的测量规格,确定最终的尺寸。例如,如果一个View的布局参数设置为`match_parent`,那么它将在`EXACTLY`模式下测量,尺寸等于父视图提供的大小;如果是`wrap_content`,则会在`AT_MOST`模式下测量,尺寸不超过自身内容的大小。
在`performMeasure`结束后,所有View的尺寸都已经确定,接下来会进入`performLayout`阶段,根据已知的尺寸安排View的位置,最后是`performDraw`,将视图绘制到屏幕上。
理解View的测量流程对于优化布局性能和自定义复杂视图至关重要。通过阅读源码,开发者可以更深入地了解Android系统如何处理UI更新,从而编写出更高效、更符合需求的代码。
2020-08-31 上传
2021-01-05 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38562026
- 粉丝: 3
- 资源: 949
最新资源
- Python-DataStructure-GFG-实践
- Starling-Extension-Particle-System:Starling框架的粒子系统,与71squared.com的“粒子设计器”兼容
- 30dayJSPractice:我将按照Wes BosJavaScript 30课程来练习Vanilla JS。 此知识库中有一些个人笔记的解决方案,可帮助我在JS上更强壮
- audiobook-player-alexa
- 新翔ASP培训学校教学管理系统
- Excel模板考场桌面标签.zip
- datepicker:显示日历,然后为彩票选择随机日期
- EPANET:供水系统液压和水质分析工具包
- MAX31855温度检测_MAX31855
- SimpleMachineLearningExp:我与机器学习的第一次互动!
- A-Recipe:Soorji ka Halwa的食谱。 享受!
- 无限跑者游戏
- DesignPattern:设计模式小Demo
- BMITaven.rar
- manga4all-ui:manga4all-ui
- InjectableGenericCameraSystem:这是一个通用的相机系统,可用作相机在游戏内拍摄屏幕截图的基础。 该系统的主要目的是通过用我们自己的值覆盖其摄像机结构中的值来劫持游戏中的3D摄像机,以便我们可以控制摄像机的位置,俯仰角值,FoV和摄像机的外观向量