View绘制---onMeasure()重写

重写方法:

protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec);

MeasureSpec类:

MeasureSpec是一个32位的int值,高2位是测量模式,低30位是测量大小。

三种测量模式:

EXACTLY:当给控件的layout_width或layoutt_height属性指定具体数值时,或者match_parent时,系统调用这种模式;

AT_MOST:layout_width或layout_height属性指定为wrap_content时,此时的控件尺寸只要不超过父控件允许的最大尺寸。

UNSPECIFIED:不限制大小,绘制自定义View时使用.

当自定义view需要支持wrap_content时,需要如下重写:

必须实现前三个构造方法

public class MyView extends View {


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

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(measureWidth(widthMeasureSpec),measureHeight(heightMeasureSpec));
    }

    private int measureWidth(int measureSpec){
        int result = 0;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        if(specMode==MeasureSpec.EXACTLY){
            result = specSize;
        }else{
            result = 200;
            if(MeasureSpec.AT_MOST==specMode){
                result = Math.min(result,specSize);
            }
        }
        return result;
    }

    private int measureHeight(int measureSpec){
        int result = 0;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        if(specMode==MeasureSpec.EXACTLY){
            result = specSize;
        }else{
            result = 200;
            if(MeasureSpec.AT_MOST==specMode){
                result = Math.min(result,specSize);
            }
        }
        return result;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值