
Android View的绘制流程
setFrame方法:通过 setFrame 方法设置View的四个边界参数,确定View在父容器中的显示区域。 dispatchDraw方法:负责绘制子View,调用每个子View的
绘制背景。 保存画面层(可选)。 绘制内容(onDraw方法)。 绘制子View(通过dispatchDraw方法)。 恢复画面层(可选)。 绘制滚动条(可选)。 背景绘制:调用View的背景Drawable进行绘制,确保背景显示正确。 内容绘制:调用View的 子View绘制:通过
发布日期:2021-05-14 17:57:15
浏览次数:14
分类:精选文章
本文共 2078 字,大约阅读时间需要 6 分钟。
Android View的Measure、Layout和Draw过程
在Android开发中,View的绘制和事件处理是两个重要的主题。本文将重点分析View的Measure、Layout和Draw过程,为开发者提供深入理解和实用的技巧。
Measure过程
对于View的测量,我们首先需要了解MeasureSpec的概念。MeasureSpec是由两个单词组成的概念,意为“测量规格”或“测量参数”,用于描述View的大小和布局要求。
MeasureSpec的模式解析
MeasureSpec由高两位和低30位组成,前两位表示模式,后30位表示大小。模式有三种:
- EXACTLY:表示精确大小,大小值必须严格遵守。
- AT_MOST:表示最大值,大小不能超过指定值。
- UNSPECIFIED:表示未指定,默认不限制大小。
MeasureSpec的计算过程
MeasureSpec的计算涉及父容器的MeasureSpec和子容器的LayoutParams。通过getChildMeasureSpec
方法,结合父容器的MeasureSpec、子容器的LayoutParams以及已使用空间,计算出子容器的MeasureSpec。
View的onMeasure方法
View的测量主要由onMeasure
方法完成,默认实现如下:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension( getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec), getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec) );}
setMeasuredDimension
方法用于设置View的测量结果,初始化默认值并根据MeasureSpec计算出最终尺寸。
Layout过程
Layout过程的主要目的是确定View在父容器中的绝对位置。Layout的核心是确定四个参数:left、top、right、bottom。
ViewGroup的layout方法
ViewGroup的layout
方法由super.layout(l, t, r, b)
完成,继承自View的实现:
public final void layout(int l, int t, int r, int b) { // 该方法的主要作用是确定View的绝对位置。}
每个ViewGroup实现自己的onLayout
方法,根据子View的测量结果确定各子View的位置。
关键点分析
draw
方法。Draw过程
Draw过程主要负责将View内容绘制到屏幕上,整个过程分为六个步骤:
关键点分析
onDraw
方法,实现View的内容绘制。dispatchDraw
方法递归绘制所有子View。示例分析
通过一个简单的线性布局示例,分析View的Measure、Layout和Draw过程:
- 布局文件:
### Measure过程- **根View的MeasureSpec**:由WindowManager生成,包含屏幕尺寸和LayoutParams参数。- **子View的MeasureSpec**:根据父View的MeasureSpec和子View的LayoutParams计算得出,结合Padding和Margin。- **TextView的MeasureSpec**:根据父View的MeasureSpec和LayoutParams,最终确定尺寸。### Layout过程- **根View的布局**:设置自己的位置和尺寸。- **子View的布局**:根据测量结果确定其在父View中的位置,调用`layout`方法。### Draw过程- **根View的绘制**:绘制背景和内容。- **子View的绘制**:递归绘制所有子View,确保屏幕显示正确。---通过以上分析,可以清晰地理解Android View的Measure、Layout和Draw过程。这三步骤共同确保了View的正确显示和交互,构成了Android视图系统的核心逻辑。
发表评论
最新留言
很好
[***.229.124.182]2025年04月24日 05时50分50秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
无法打开文件“opencv_world330d.lib”的解决办法
2019-03-11
算法训练 未名湖边的烦恼(递归,递推)
2019-03-11
什么是接口
2019-03-11
记录-基于springboot+vue.js实现的超大文件分片极速上传及流式下载
2019-03-11
JavaScript高级程序设计第四版学习记录-第九章代理与反射
2019-03-11
怎么解决Windows 10文件/文件夹正在使用无法删除
2019-03-11
matlab函数:fix 向0取整
2019-03-11
Allegro中如何消除器件本身Pin间距报错
2019-03-11
Flask--简介
2019-03-11
16 python基础-恺撒密码
2019-03-11
Frame--Api框架
2019-03-11
Boostrap技能点整理之【网格系统】
2019-03-11
新闻发布项目——业务逻辑层(UserService)
2019-03-11
hibernate正向生成数据库表以及配置——hibernate.cfg.xml
2019-03-11
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
2019-03-11
java实现人脸识别源码【含测试效果图】——Dao层(IUserDao)
2019-03-11
使用ueditor实现多图片上传案例——前台数据层(Index.jsp)
2019-03-11
解决Chrome播放视频闪屏黑屏无法播放
2019-03-11