onMeasure测量理解

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测量理解_第1张图片
image.png

往右边滑动是负数
往左边滑动式正数

测量onMeasure()说明:

lt点(左上)|rb点(右下)
宽度: 右边的距离减掉左边的距离
高度: 底部的距离减掉顶部的距离

作用(就是为了能良好的测量孩子View的大小显示)

  1. 测量的时候测量多次
  2. widthMeasureSpec父层视图给当前视图的宽和模式

系统的onMeasure所干的事:

1, 根据widthMeasureSpec求得宽度,和父类view给的模式(高以此类推)
2, 根据自身的宽度width,和自身的padding 值,相减(减去两边){父类的宽度减去padding值},求得子View可以拥有的宽度newWidth
3, 根据newWidth和模式求得一个新的MeasureSpec值:
MeasureSpec.makeMeasureSpec(newSize,newmode);
用新的MeasureSpec来计算View

图解:ViewGroup进行测量:如果是View执行MeasureSpec测量;反之是ViewGroup的话就会MeasureChild测量孩子

onMeasure测量理解_第2张图片
IMG_0668.PNG

到此为止,我已经了解到自定义控件的基本步骤:

1. 继承View,重写构造方法

2. 自定义属性,在构造方法中初始化属性

3. 重写onMeasure方法测量宽高

4. 重写onDraw方法绘制控件

你可能感兴趣的:(onMeasure测量理解)