Android自定义控件onMeasure方法简单的重写

       写一个自定义控件,只写了onDraw方法,在XML文件中使用,设置宽高为wrap_content,发现在canvas上画的内容很少,但canvas占的空间是整个屏幕,其它控件被覆盖了,

因为对自定义控件使用的也不是很熟练,所以猜测是因为没有重写onMeasure方法,后面在网上找了下资料,试着去重写了onMeasure方法,将问题解决,在此做个记录,以便 以后查看。

       下面以测量控件的宽度为例

       1、使用MeasureSpec 的getMode()方法,获取父控件测量宽度的模式;使用MeasureSpec 的getSize()方法,获取父控件测量宽度的值。

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

       2、根据模式来确定宽度的具体大小

       模式有三种:

            MeasureSpec.EXACTLY:这个模式代表的是控件设置的宽度是具体值或者是match_parent,则具体的宽度就等于父控件测量的宽度。

            MeasureSpec.AT_MOST:这个模式代表的是控件的宽度不能超过屏幕的宽度,具体宽度的值是,控件自身需要多宽就显示多宽,最宽就为屏幕的宽度。

            MeasureSpec.UNSPECIFIED:这个模式代表的是对控件的宽度不做限制,控件有多宽,就让它显示多宽,超过了屏幕的宽度也会显示。

      if (widthMode == MeasureSpec.EXACTLY) {
            width =widthSize;
        } else {
            width = getNeedWidth()+getPaddingLeft()+getPaddingRight();
            if (widthMode == MeasureSpec.AT_MOST) {
                width = Math.min(widthSize, width);
            }
        }

      其中getNeedWidth()方法需要自己写,这个方法就是返回自己所画内容所需的宽度。

      3、使用自己测量的宽度和父控件测量的模式,重新组成测量值

            int measureWidth = MeasureSpec.makeMeasureSpec(width, widthMode);

      4、使用setMeasuredDimension()方法保存自己测量的值。

            setMeasuredDimension(measureWidth, measureHeight);

你可能感兴趣的:(Android自定义控件)