view.measure(0,0)

有时候我们需要自己去测量View的宽高,比如说在系统还没有完成对View测量的时候,我们就想知道View的大小,怎么办呢?
一般我们是这样写的:view.measure(0,0);调用完之后调用view.getMeasuredWidth(),view.getMeasuredHeight()就可以获取到view的宽高,这样写的原理是什么呢?
这是简写,通常步骤是这样的:

        int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
        view.measure(widthSpec, heightSpec);
        int measuredHeight = textView.getMeasuredHeight();//测量得到的textview的高
        int measuredWidth = textView.getMeasuredWidth();//测量得到的textview的宽

只是这种情况下,widthSpec和heightSpec的值都是0,所以可以这样简写,那么为什么调用view.measure(0,0)就可以测量出view的大小呢?
其实能够测量成功的前提是:重写了View的onMeasure方法,在onMeasure方法中有测量逻辑,如果你没有重写View的onMeasure方法,那么直接调用view.measure(0,0)肯定是测量不到的,系统的View都已经重写了onMeasure方法,并且写好了测量的逻辑,所以我们才可以这样用。
看下系统TextView是怎么实现的?
在onMeasure方法中:


对高度的测量

很明显:EXACTLY模式下height是取的heightMeasureSpec中的size,这个我们在构造heightMeasureSpec是不知道size的,所以才去测量的,这个模式肯定不行;AT_MOST模式height取的是desired和size的最小值,size我们也是不知道写多少,所以只能用UNSPECIFIED

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容