UI不好,工作难保!自定义View是Android程序员的分水岭?安卓开发升职加

ViewGroup的【生命周期流程】:


Q:为什么有些方法会被调用多次?
A:我个人理解因为对于一个ViewGroup进行measure的时候,一个View的大小依赖于measure子View和父View的measureSpec,所以一个View的onLayout onMeasure方法会被调用多次。
课程1自定义FlowLayout:
自定义FlowLayout其实就是自定义一个ViewGroup,我们关注的点主要在onMeasure和onLayout:

onMeasure部分
- 测量的关系,ViewGroup在进行measure时,需根据子View的大小调整自身。
- 在ViewGroup中onMeasure时,不能直接将从上面传下的measureSpec传给子View。
- onMeasure的过程:
- 度量孩子 -> for 孩子的height width,通过getChildMeasureSpec方法设置正确的measurespec,然后重新measure
- 度量自己 -> setMeasureDimension(),和自身的功能相关,并且最后需要根据MeasureSpec调整

onLayout部分
坐标系

onLayout的四个参数,都是参考ViewGroup(图二)

4. 在后续的layout measure过程中可能会改变的变量需要注意避免在构造函数中初始化,因为构造函数只会调用一次,measure layout会调用多次。
5 . measure过程还是需要注意使用getChildMeasureSpec,同时注意view inflate的问题:

LayoutInflater.inflate(res, parent, false),如果不是这样会导致,根View(temp)无法执行setLayoutParams,这样child.getLayoutParams也会出问题。
面试问题总结:
Q1:MeasureSpec和LayoutParams之间有关联吗?为什么有了LayoutParams还需要MeasureSpec?
View在xml中通过使用android:layout_width等方式告诉父容器布局方式(其实是LayoutParams的xml属性),LayoutParams+父布局决定了MeasureSpec。

Q2:如何将xml中的定义转变成MeasureSpec?

使用getChildMeasureSpec,getChildMeasureSpec在任主席的《安卓开发艺术探索》中有总结。其中第二个参数padding来自parent ,第一个参数是父亲的MeasureSpec,最后一个是子需要的大小。


Q3:为什么需要measure
