自定義view

測(cè)量,賦值,繪制

  1. 測(cè)量:父view調(diào)用子view的onMeasure()方法,首先看子view是一個(gè)view還是viewgroup, 如果子view是一個(gè)view,直接調(diào)用它的onMeasure方法去測(cè)量,并把測(cè)量結(jié)果返回給父view。如果子view是一個(gè)viewgroup, 分別測(cè)量每個(gè)子view,保存每個(gè)子view的尺寸,并且計(jì)算并保存自己的尺寸。
    1.測(cè)量已有view的尺寸
public class MyImageView extends android.support.v7.widget.AppCompatImageView {
    public MyImageView(Context context) {
        super(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int width = getMeasuredWidth();
        int height = getMeasuredHeight();

        if (width > height) {
            width = height;
        } else {
            height = width;
        }

        setMeasuredDimension(width, height);

    }
}

2.測(cè)量自定義view的尺寸

public class CustomView extends ViewGroup {

    public CustomView(Context context) {
        super(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        
        int width = getMeasuredWidth();
        int height = getMeasuredHeight();
        
        width = resolveSize(width, widthMeasureSpec);
        height = resolveSize(height, heightMeasureSpec);
        
        setMeasuredDimension(width, height);
        
    }

    public static int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
        final int specMode = MeasureSpec.getMode(measureSpec);
        final int specSize = MeasureSpec.getSize(measureSpec);
        final int result;
        switch (specMode) {
            case MeasureSpec.AT_MOST:
                if (specSize < size) {
                    result = specSize | MEASURED_STATE_TOO_SMALL;
                } else {
                    result = size;
                }
                break;
            case MeasureSpec.EXACTLY:
                result = specSize;
                break;
            case MeasureSpec.UNSPECIFIED:
            default:
                result = size;
        }
        return result | (childMeasuredState & MEASURED_STATE_MASK);
    }
    
    

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        
    }
}

3.測(cè)量與布局自定義view

public class MyView extends ViewGroup {


    public MyView(Context context) {
        super(context);
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        
        int viewCount = getChildCount();

        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);

        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        for (int i = 0; i < viewCount; i++) {

            View view = getChildAt(i);
            LayoutParams lp = view.getLayoutParams();
            int childMeasureSpec;
            switch (lp.width) {
                case LayoutParams.MATCH_PARENT:
                    if(widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST){
                        childMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize - 10, MeasureSpec.EXACTLY);
                    }else {
                        childMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
                    }
                    break;
                case LayoutParams.WRAP_CONTENT:
                    if(widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST){
                        childMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize- 10 , MeasureSpec.AT_MOST);
                    }else{
                        childMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
                    }
                default:
                    childMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY);
                    break;
            }

        }

    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int viewCount = getChildCount();
        for(int i=0; i<viewCount; i++){
            View view = getChildAt(i);
            view.layout(getLeft(), getTop(), getRight(), getBottom());
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容