onLayout设置每个孩子在当前的位置大小
但如果孩子是布局的话,没有给的控件测量大小,因控件没有测量大小所以就不会显示出来(就是在addView添加一个布局的时候)
遍历孩子,给每个孩子进行测量显示
//获取每一个View孩子进行测量(如布局:目的就是让他的孩子也执行onMeasure测量)
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
for (int i = 0; i < getChildCount(); i++) {
View chid=getChildAt(i);
//如果孩子是ViewGroup那么就会进去测量ViewGroup的孩子View
chid.measure(widthMeasureSpec,heightMeasureSpec);
}
}
往右边滑动是负数
往左边滑动式正数
测量onMeasure()说明:
lt点(左上)|rb点(右下)
宽度: 右边的距离减掉左边的距离
高度: 底部的距离减掉顶部的距离
作用(就是为了能良好的测量孩子View的大小显示)
- 测量的时候测量多次
- widthMeasureSpec父层视图给当前视图的宽和模式
系统的onMeasure所干的事:
1, 根据widthMeasureSpec求得宽度,和父类view给的模式(高以此类推)
2, 根据自身的宽度width,和自身的padding 值,相减(减去两边){父类的宽度减去padding值},求得子View可以拥有的宽度newWidth
3, 根据newWidth和模式求得一个新的MeasureSpec值:
MeasureSpec.makeMeasureSpec(newSize,newmode);
用新的MeasureSpec来计算View