onMeasure()的重写
- 调用每个子View的measure(),让子View自我测量
根据自己的MeasureSpec中mode的不同:
- EXACTLY/AT_MOST:可用空间(MeasureSpec)中的size
- UNSPECIFIED:可用空间:无限大
- 根据子View给出的尺寸,得出子View的位置,并保存他们的位置和尺寸
关于保存子View位置的两点说明:
- 不是所有的Layout都需要保存子View的位置(因为有的Layout可以在布局阶段实时推导出子View的位置,例如LinearLayout)
- 有时候对某些子View需要重复测量两次或多次才能得到正确的尺寸和位置
- 根据子View的位置和尺寸计算出自己的尺寸,并用setMeasuredDimension()保存
onLayout()的重写
Android官方标准的写法
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// The layout has actually already been performed and the positions
// cached. Apply the cached values to the children.
final int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
if (child.getVisibility() != GONE) {
RelativeLayout.LayoutParams st =
(RelativeLayout.LayoutParams) child.getLayoutParams();
child.layout(st.mLeft, st.mTop, st.mRight, st.mBottom);
}
}
}
onDraw()的重写
这部分可根据实际业务场景需求去编写,也有些ViewGroup是没有重写该方法的,如RelativeLayout
。
网友评论