第一部份
1.measure 是一个计算视图窗口大小的过程,measure的本质是把视图窗口的相对值转化为绝对值的过程。view的最终的的measureWidth或measureHeight是被函数setMeasuredDimension(int, int) 设置。
所以不管 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
...
...
不管上面如何计算,最终measure 的尺寸都有
setMeasuredDimension(int, int) //
}
2. 关于widthMeasureSpec, heightMeasureSpec , 这两个参数怎么获得的,我又怎么构造子view的widthmeasure和 heightMeasureSpec ?
这两个参数是有parent view所能提供的宽、高和view本身的布局参数(就是我们在xml设置的layout_width,layout_height)共同决定的决定的。这点可以可以在ViewGroup的方法getChildMeasureSpec()中得到验证。
所以一个view的measure dimen 是由三方共同作用的,第一,parent view 所留下的空间。第二,使用view的人(就是在xml中定义layout_width或layout_height的人)。第三 定义view的人,就是给view写代码的人,也就是在onMeasure()中写代码的。不要把第二、三类人混淆起来,其实二者在逻辑上是完全不同的人。
3. protected void onLayout(boolean changed, int l, int t, int r, int b) {
//在这里设置child view的位置。需要利用上面 measureWidth和onMeasureHeigh.
// 当然,如果你也可以不管不顾,就是 child view强制设置位置是完全可以的
...
...
childView.layout(childL,childT, childR,childB);
}
第二部分