天天看點

Android onMeasure

Android onMeasure

import android.content.Context;
import android.graphics.Color;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

public class MyView extends View {
    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.setBackgroundColor(Color.RED);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //假設設定View的預設寬高最小為100。
        int width = measureWidth(100, widthMeasureSpec);
        int height = this.getDefaultSize(100, heightMeasureSpec);

        //設定最終測量結果。
        setMeasuredDimension(width, height);
    }

    private int measureWidth(int size, int measureSpec) {
        int result = size;
        int specMode = MeasureSpec.getMode(measureSpec);//解析出模式。
        int specSize = MeasureSpec.getSize(measureSpec);

        switch (specMode) {
            case MeasureSpec.UNSPECIFIED:
                break;

            //設定了android:layout_width="wrap_content"
            case MeasureSpec.AT_MOST:
                result = specSize;
                break;

            //設定了android:layout_width="match_parent"或一個具體的dp/pix值。
            case MeasureSpec.EXACTLY:
                result = size;
                break;
        }

        return result;
    }
}           

繼續閱讀