参考:学习视频
一、自定义View:布局基础
布局过程的自定义
- 方式:重写布局过程的相关方法
- 测量过程:onMeasure()
- 布局过程:onLayout()
- 具体
- 重新onMeasure()来修改已有的View的尺寸
- 重写onMeasure()来全新计算自定义View的尺寸
- 重写onMeasure()和onLayout()来全新计算自定义ViewGroup的内部布局
二、全新定义View尺寸的方式
- 重写onMeasure()把尺寸计算出来
- 把计算的结果用resolveSize()过滤一遍后保存
重写onMeasure()修改尺寸
- 重写onMeasure(),并调用super.onMeasure()触发原先的测量
- 用getMeasuredWidth()和getMeasuredHeight()取到之前测得的尺寸,利用这两个尺寸来计算出最终尺寸。
- 使用setMeasuredDimension()保存尺寸
三、定制Layout的内部布局
onMeasure()的重写
- 调用每个子View的measure(),让子View自我测量
- 根据子View给出的尺寸,得出子View的位置,并保存它们的位置和尺寸
- 根据子View的位置和尺寸计算出自己的尺寸,并用setMeasuredDimension保存
关于保存子View位置的两点说明:
- 不是所有的Layout都需要保存子View的位置(因为有的Layout可以在布局阶段实时推导出子View的位置,例如LinearLayout)
- 有时候对某些子View需要重复测量两次或多次才能得到正确的尺寸和位置
“可用空间”的判断方法
根据自己的MeasureSpec中mode的不同
1. EXACTLY/AT_MOST
可用空间:MeasureSpec中的size
2. UNSPECIFIED
可用空间:无限大
Layout内部布局的自定义
- 重写onMeasure()来计算内部布局
1)计算子View的尺寸
① 关键:宽带和高度的MeasureSpec的计算
② 结合开发者的要求(Layout_xxx)和 自己的可用空间(自己的尺寸上限 - 已用尺寸)
2)计算子View的位置并保存子View的位置和尺寸
3)计算自己的尺寸并保存 - 重写onLayout()来摆放子View