布局过程的含义:
布局过程,就是程序在运行时利用布局文件的代码来计算出实际尺寸的过程
布局过程的工作内容
测量阶段和布局阶段
测量阶段:
从上到下递归地调用每个View或者ViewGroup的measure() 方法,测量他们的尺寸并计算它们的位置
布局阶段:
从上到下递归地调用每个View或者ViewGroup的layout()方法,把测得的尺寸和位置赋值给它们
View或ViewGruop的布局过程
1、测量阶段:
measure()方法被父View调用,在measure方法中做一些准备和优化工作后,调用onMeasure()方法来进行实际的自我测量
(1) View: View在onMeasure() 中计算出自己的尺寸,然后保存
(2) ViewGroup :ViewGroup在onMeasure()中调用所有子View的measure方法
让它们进行自我测量,并根据子View计算出的期望尺寸来计算出它们的实际尺寸和位置然后保存
同时,也会根据子View的尺寸和位置来计算出自己的尺寸然后保存。
2、布局阶段:
layout()方法被父View调用,在layout()方法中保存父View传递过来的自己的位置和尺寸,并调用onLayout()
来进行实际的内部布局
(1) View:没有子View ,所以View的onLayout() 方法什么也不做
(2) ViewGroup: ViewGroup在onLayout() 方法中会调用所有子View的
layout() 方法,把它们的尺寸和位置传给它们,让它们完成自我的内部布局
布局过程自定义方式:
重写onMeasure() 来修改已有的View的尺寸;
重写onMeasure() 来全新定制自定义View的尺寸;
重写onMeasure()和onLayout() l来全新定制自定义ViewGroup的内部布局
第一类自定义的具体做法:
(1) 重写onMeasure(),调用super.onMeasure(),触发原有的自我测量;
(2) 在super.onMeasure()下面调用getMeasuredHeight()和getMeasuredWidth()来获取之前测量的结果,并根据自己的算法,计算出新的结果
(3) 调用 setMeasuredDimension() 方法保存新的结果