Android-View的测量

Android View的测量

在绘制View之前,要对整个View进行测量,这个过程就在onMeasure()方法中进行的。

测量的模式

  1. EXACTLY
    • 精确值模式,当控件的width和height设置为具体值或者match_parent时就是这个模式
  2. UNSPECIFIED
    • 这个属性不指定测量的模式,View想多大就多大
  3. AT_MOST
    • 最大值模式,当控件的width和height设置为wrap_context时就是这个模式,控件的大小随着子控件的大小而变化

其中View类默认的onMeasure()方法只支持EXACTLY模式,所以说如果不重写onMeasure()方法的话就只能使用EXACTLY模式。

一言不合上代码

public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    setBackgroundColor(Color.BLUE);
} 

这里我只给当前自定义View设置了一个背景颜色,然后在XML中设置成wrap_content

<com.github.wanglu1209.CustomView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" /> 

《Android-View的测量》

运行起来就是这样全屏的,下面我们还是这个例子,重写onMeasure()方法

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
     
    int specMode, specSize = 0;
    int mWidth, mHeight;

    /**
     * Measure Width
     */
    specMode = MeasureSpec.getMode(widthMeasureSpec);
    switch (specMode){
        case MeasureSpec.AT_MOST:   //wrap_content
            specSize = 200;
            break;
        case MeasureSpec.EXACTLY:   //math_content 和 精确值
            specSize = MeasureSpec.getSize(widthMeasureSpec);
            break;
        case MeasureSpec.UNSPECIFIED:
            specSize = 400;
            break;
    }
    mWidth = specSize;

    /**
     * Measure Height
     */
    specMode = MeasureSpec.getMode(heightMeasureSpec);
    switch (specMode){
        case MeasureSpec.AT_MOST:   //wrap_content
            specSize = 200;
            break;
        case MeasureSpec.EXACTLY:   //math_content 和 精确值
            specSize = MeasureSpec.getSize(heightMeasureSpec);
            break;
        case MeasureSpec.UNSPECIFIED:
            specSize = 400;
            break;
    }
    mHeight = specSize;

    /**
     * 最后调用setMeasuredDimension进行赋值
     */
    setMeasuredDimension(mWidth, mHeight);
}

可以看到这里我们给wrap_content赋值200,我们XML代码不变还是wrap_content,运行一下程序

《Android-View的测量》

可以看的出来大小确实变成了200,通过这个小例子就可以对View的测量有一个不错的认识了,并没有什么高深莫测的东西,一步一步来。

最后

爱生活,爱小丽,爱Android

    原文作者:爱小丽
    原文地址: https://www.jianshu.com/p/0de73b9ba03f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞