通常,在我们想要获取一个view的宽高时,我们都会想到在oncreate()中使用view.getWidth()和view.getHeight()方法来获取。这看起来并没有什么问题,但它们的值却都为0,并不是我们想要的结果。为什么会这样呢?这是因为在oncreate()时view的绘制工作还未完成,也就获取不到我们想要view的宽高了。
我们可以使用下面几种方式来获取view的宽高:
方法1
重写Activity中的onWindowFocusChanged()方法。
1 2 3 4 5
| @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.i("textView", "width-->>" + textView.getWidth() + "--height-->>" + textView.getHeight()); }
|
方法2
使用测量的方法。
1 2 3 4 5 6 7 8 9
| int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
textView.measure(w, h);
int width = textView.getMeasuredWidth(); int height = textView.getMeasuredHeight();
Log.i("textView", "width-->>" + width + "--height-->>" + height);
|
方法3
添加组件绘制监听OnPreDrawListener。
1 2 3 4 5 6 7 8 9
| ViewTreeObserver vto =textView.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { textView.getViewTreeObserver().removeOnPreDrawListener(this); Log.i("textView", "width-->>" + textView.getWidth() + "--height-->>" + textView.getHeight()); return false; } });
|
方法4
添加组件绘制监听OnGlobalLayoutListener。
1 2 3 4 5 6 7 8
| ViewTreeObserver vto =textView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { textView.getViewTreeObserver().removeOnGlobalLayoutListener(this); Log.i("textView", "width-->>" + textView.getWidth() + "--height-->>" + textView.getHeight()); } });
|
方法5
1 2 3 4 5 6
| textView.post(new Runnable() { @Override public void run() { Log.i("textView", "width-->>" + textView.getWidth() + "--height-->>" + textView.getHeight()); } });
|