获取view宽高有两种方法:
-
getMeasrureHeight()/getNeasureWidth() :此方法在measure是对控件进行测量,在onMeasure后得到值。
也可以在getMeasureHeight之前手动调用一下measure()方法获取高度。但手动measure需要根据View的LayoutParams来区分
int widthMeasurewSpec; int HeightMeasurewSpec; //如果是match_parent,不要使用此方法,理论上不知道父容器的剩余空间所以无法准确测出数值 //如果是具体的数值:100,250 widthMeasurewSpec = MeasureSpec.makeMeasureSpec(100,MeasureSpec.EXACTLY); HeightMeasurewSpec = MeasureSpec.makeMeasureSpec(250,MeasureSpec.EXACTLY); //如果是wrap_content widthMeasurewSpec = MeasureSpec.makeMeasureSpec((1<<30)-1,MeasureSpec.AT_MOST); HeightMeasurewSpec = MeasureSpec.makeMeasureSpec((1<<30)-1,MeasureSpec.AT_MOST); view.measure(widthMeasurewSpec, HeightMeasurewSpec);//主动通知系统去测headerView的高度 int measuredHeight = view.getMeasuredHeight();
p.s. 系统可能会通过多次么measure才能确定最终的宽高,因此还是在layout中获取最终宽高比较稳妥
-
getHeight()/getWidth():此方法在onLayout后才能获取到值。所以它的使用方法最早就是在layout调用之后的回调中获取值
headerView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int Height = headerView.getHeight(); headerView.getViewTreeObserver() .removeGlobalOnLayoutListener(this);//一定要移除,因为onLayout()会执行多次,如果不移除的话 也会被回调多次,而且值还不一样 } });
通常来讲,getHeight()和getMeasuredHeight()方法获取的值其实是一样的。当在代码中调用view的layout()方法对view的布局进行更改,时getHeight()获取到的是更改后的值。
使用时注意(本人的一些实践下的思路):
存在取不到view宽高的情况,通常存在于对这个view修改之后不久就调用了这个 view的get宽高方法,所以才会出现get出来是0的情况,那么我们避免这种get出0根本的解决思路应该是:
- 首先不应该在修改前后取宽高(或在确定view绘制完成之后再来取)
- 其次是取确定已经绘制完成的相关view的宽高反推本view的宽高
- 最后逼不得已才是通过上述这种牺牲性能的方式取。