宝剑锋从磨砺出,梅花香自苦寒来。这篇文章主要讲述Android布局基础相关的知识,希望能为你提供帮助。
文章图片
布局过程的含义布局过程,就是程序在运行时利用布局文件的代码来计算出实际尺寸的过程。
布局过程的工作内容两个阶段:测量阶段和布局阶段。
测量阶段:从上到下递归地调用每个 View 或者 ViewGroup 的 measure() 方法,测量他们的尺寸并计算它们的位置; 布局阶段:从上到下递归地调用每个 View 或者 ViewGroup 的 layout() 方法,把测得的它们的尺寸和位置赋值给它们。
View 或 ViewGroup 的布局过程
- 测量阶段,
measure()
方法被父 View 调用,在measure()
中做一些准备和优化工作后,调用onMeasure()
来进行实际的自我测量。onMeasure()
做的事,View
和ViewGroup
不一样:
- View:
View
在onMeasure()
中会计算出自己的尺寸然后保存; - ViewGroup:
ViewGroup
在onMeasure()
中会调用所有子 View 的measure()
让它们进行自我测量,并根据子 View 计算出的期望尺寸来计算出它们的实际尺寸和位置(实际上 99.99% 的父 View 都会使用子 View 给出的期望尺寸来作为实际尺寸,原因在下期或下下期会讲到)然后保存。同时,它也会根据子 View 的尺寸和位置来计算出自己的尺寸然后保存;
- View:
- 布局阶段,
layout()
方法被父 View 调用,在layout()
中它会保存父 View 传进来的自己的位置和尺寸,并且调用onLayout()
来进行实际的内部布局。onLayout()
做的事,View
和ViewGroup
也不一样:
- View:由于没有子 View,所以
View
的onLayout()
什么也不做。 - ViewGroup:
ViewGroup
在onLayout()
中会调用自己的所有子 View 的layout()
方法,把它们的尺寸和位置传给它们,让它们完成自我的内部布局。
- View:由于没有子 View,所以
- 重写
onMeasure()
来修改已有的View
的尺寸; - 重写
onMeasure()
来全新定制自定义View
的尺寸; - 重写
onMeasure()
和onLayout()
来全新定制自定义ViewGroup
的内部布局。
也就是重写
onMeasure()
来修改已有的
View
的尺寸的具体做法:- 重写
onMeasure()
方法,并在里面调用super.onMeasure()
,触发原有的自我测量; - 在
super.onMeasure()
的下面用getMeasuredWidth()
和getMeasuredHeight()
来获取到之前的测量结果,并使用自己的算法,根据测量结果计算出新的结果; - 调用
setMeasuredDimension()
来保存新的结果。
View
的尺寸- 全新定制尺寸和修改尺寸的最重要区别
- 父 View 的尺寸限制
- 由来:开发者的要求(布局文件中
layout_
打头的属性)经过父 View 处理计算后的更精确的要求; - 限制的分类:
UNSPECIFIED
:不限制AT_MOST
:限制上限EXACTLY
:限制固定值
-
全新定义自定义 View 尺寸的方式
- 重新
onMeasure()
,并计算出 View 的尺寸; - 使用
resolveSize()
来让子 View 的计算结果符合父 View 的限制(当然,如果你想用自己的方式来满足父 View 的限制也行)。
- 重新
- 重写
onMeasure()
来计算内部布局 - 重写
onLayout()
来摆放子 View
- 重写 onMeasure() 的三个步骤:
- 调用每个子 View 的
measure()
来计算子 View 的尺寸 - 计算子 View 的位置并保存子 View 的位置和尺寸
- 计算自己的尺寸并用
setMeasuredDimension()
保存
- 计算子 View 尺寸的关键
measure()
方法的两个参数——也就是子 View 的两个
MeasureSpec
的计算。- 子 View 的 MeasureSpec 的计算方式:
- 结合开发者的要求(xml 中
layout_
打头的属性)和自己的可用空间(自己的尺寸上限 - 已用尺寸) - 尺寸上限根据自己的
MeasureSpec
中的 mode 而定- EXACTLY / AT_MOST:尺寸上限为
MeasureSpec
中的size
- UNSPECIFIED:尺寸无上限
- EXACTLY / AT_MOST:尺寸上限为
- 重写 onLayout() 的方式
onLayout()
里调用每个子 View 的
layout()
,让它们保存自己的位置和尺寸。推荐阅读
- Win10系统office图标显示白板怎样处理?
- Mybatis 基于注解Mapper源码分析
- android实验3---界面信息保存入SD卡权限
- SAP成都研究院李三郎(SCP Application Router简介)
- android--------Socket的简单了解
- 夜神安卓模拟器下载及简介
- Fiddler2如何对Android应用进行抓包
- 安卓开发(四种对话框)
- Xamarin.Android 记住账号