view.measure(0,0)

2019-12-31  本文已影响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

上一篇 下一篇

猜你喜欢

热点阅读