Android获取View宽高的几种方式
breewf

通常,在我们想要获取一个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());
}
});