有时候我们需要自己去测量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