自定义的onMeasure()方法

计算尺寸的模式:
AT_MOST 父容器告诉空间,空间自身最大能够有多大,
如果空间内容超过了这个尺寸,空间进行换行的处理(对应wrap_content)


EXACTLY:父容器容空间有多大,控件必须多大
对应的布局属性:match_parent 以及特定的dp尺寸,就是300dp


当EXACTLY的模式,控件原有内容的尺寸就会忽略掉


当AT_MOST的时候,必须计算空间的尺寸;


代表 当一个空间,设置尺寸为wrap_content的时候,就需要计算空间内容的尺寸。


4:UNSPECIFIED 了解一下,就是ScrollView 内部的所有控件的onMeasure 参数模式,都是这个;
调研,ScrollView +ListView 显示的状态,以及ListView onMeasure 方法内部的执行方式。
((((((((((((((((((((((((((
<com.kodulf.fullycustomerview.widget.SimpleView
        android:id="@+id/simple_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#ccc"
        />






    /**
     * 当空间在布局中的时候,布局需要排版,就需要获取控件的尺寸
     * 就会最终调用到这个onMeasure 方法
     * 父容器会给这个测量的方法,传递两个重要的数值,代表入容器还有多少空间可以放控件
     *
     * @param widthMeasureSpec 是经过编码的数值,包含芙蓉起剩余的宽度,或者是控件可用的最大宽度,以及尺寸计算模式
     * @param heightMeasureSpec 同上,代表高徒可用数值与高度尺寸计算模式。
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //调用父类的尺寸计算方法。如果调用了父类的,那么尺寸会计算出来,在super 调用之前可以
        //拦击数值,进行替换。只有在拦截数值的时候,才会调用父类
        //super.onMeasure(widthMeasureSpec, heightMeasureSpec);


        //如果没有调用父类的方法,那么这个方法,必须要调用setMeasuredDimension();方法
        //获取芙蓉起,可以用的宽度数值
        int wSize = MeasureSpec.getSize(widthMeasureSpec);


        //获取父容器希望空间如何计算宽度
        int wMode = MeasureSpec.getMode(widthMeasureSpec);


        int hSize = MeasureSpec.getSize(heightMeasureSpec);


        int hMode = MeasureSpec.getMode(heightMeasureSpec);


                switch(wMode){


                    case MeasureSpec.AT_MOST:
                        //因为绘制的时候,在中心点绘制了一个字符串,200像素的字符尺寸
                        //同时在生成圆形的时候,在右边空出了100像素,为了让文字被圆形覆盖,
                        //计算出来,整个控件的最小尺寸
                        wSize=400;
                        Log.d("151223MY", "width="+"AT_MOST");
                        break;
                    case MeasureSpec.EXACTLY:
                        Log.d("151223MY", "width="+"EXACTLY");
                        break;
                    case MeasureSpec.UNSPECIFIED:
                        Log.d("151223MY", "width="+"UNSPECIFIED");
                        break;
                }
        switch(hMode){


            case MeasureSpec.AT_MOST://对应高度 wrap_content
                Log.d("151223MY", "height="+"AT_MOST");
                hSize=400;
                break;
            case MeasureSpec.EXACTLY:
                Log.d("151223MY", "height="+"EXACTLY");
                break;
            case MeasureSpec.UNSPECIFIED:
                Log.d("151223MY", "height="+"UNSPECIFIED");
                break;
        }
        //计算了尺寸之后,必须调用setMeasuredDimension();


        setMeasuredDimension(wSize,hSize);


        //super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值