布局时两次遍历
第一次measure,测试child所需空间
第二次layout,给child安排空间
方法之间的相互关系,重点是measure和layout
~~~~第一遍是measure~~~~~~~~~~~
View类
measure()设置为final,禁止被派生类override
onMeasure()必须override,计算自己的大小
setMeasuredDimension()必须被调用,以此来设置在根View类中的measure尺寸变量
注意,measure的结果可以通过getMeasuredWidth()查看,是一个View类中变量
ViewGroup类派生自View类,且实现了两个接口
没有measure()
没有onMeasure(),说明使用父类onMeasure()
measureChildren()找不到调用者,可能仅仅是一个示范?
LinearLayout派生自ViewGroup类
覆盖onMeasure()
调用child.measure()也即子View的measures()来深度遍历
调用setMeasuredDimension()来设置在根View类中的measure尺寸变量
TextView类派生自View类
没有measure(),被禁止覆盖
覆盖onMeasure()
setMeasuredDimension(width, height);
~~~~第二遍是layout~~~~~~~~~~~
View类
layout(),没有被设置为final,但注释提示派生类不要覆盖,而是去覆盖onLayout(),但实际上ViewGroup覆盖了
onLayout()是个空函数,如果派生类有child则覆盖本方法,并在其中调用child.layout
通知注册的监听器
ViewGroup类
layout(),调用了父类layout(),没有调用自己的onLayout(),不过可能辗转调回自己的onLayout()?
protected abstract void onLayout(boolean changed, int l, int t, int r, int b)注意这里变成抽象方法了,也即派生类必须覆盖
LinearLayout派生自ViewGroup类
onLayout()
child.layout()
TextView类派生自View类
无layout(),也没有onLayout(),因为没有子View