获取View宽高的几种方法?
参考答案:
在Android开发中,获取View的宽高有多种方法,但需要注意的是,由于View的绘制和测量过程异步进行,所以在某些情况下可能无法直接获取到正确的宽高值。以下是一些常用的方法:
- onWindowFocusChanged方法:这个方法在View准备工作完成,当Activity窗口获取到焦点的时候会调用。在这个方法里面获取View的宽高,通常能得到正确的值。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
int width = yourView.getWidth();
int height = yourView.getHeight();
}
}
- ViewTreeObserver:通过View的ViewTreeObserver可以监听View的绘制过程,当View的绘制完成后,可以在回调中获取View的宽高。
yourView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int width = yourView.getWidth();
int height = yourView.getHeight();
}
});
- post方法:通过View的post方法,将获取宽高的操作放入到View的事件队列中,确保在View的绘制完成后执行。
yourView.post(new Runnable() {
@Override
public void run() {
int width = yourView.getWidth();
int height = yourView.getHeight();
}
});
- 在onMeasure方法中获取:如果你自定义了一个View,可以在onMeasure方法中获取到宽高的测量值。但是请注意,这个值可能不是最终的宽高,因为onMeasure可能会被多次调用,并且可能会被父容器修改。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
}
需要注意的是,以上方法获取的宽高值可能因为布局的变化、设备的旋转等因素而发生变化,所以在使用时需要注意这些情况。另外,对于某些特殊的View,如RecyclerView的ItemView等,可能需要使用其他方法来获取宽高。