在onCreate中获取View的宽高,返回值都是0,因为在onCreate中,View还没绘制,所以返回值为0,一般用的比较多的获取View宽高的方法有以下几种:
1、直接测量
通过MeasureSpec直接测量,代码如下:
mTextView = findViewById(R.id.textview);
int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
mTextView.measure(w, h);
int width = mTextView.getMeasuredWidth();
int height = mTextView.getMeasuredHeight();
不过该方法有一个缺陷:测量的View宽高必须设置为wrap_content,否则会获得固定值。
2、通过ViewTreeObserver.addOnPreDrawListener
通过对ViewTree进行监听,获取View的宽高,代码如下:
ViewTreeObserver viewTreeObserver = mTextView.getViewTreeObserver();
viewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
//需要一出监听,否则会调用多次
// viewTreeObserver.removeOnPreDrawListener(this);
int height = mTextView.getMeasuredHeight();
int width = mTextView.getMeasuredWidth();
Log.i("kingiyu", "MainActivity-->-->onPreDraw-->" + width + "->height:->" + height);
return true;
}
});
3、通过ViewTreeObserver.addOnGlobalLayoutListener
该方法和方法2差不多,只是执行顺序比方法二要前,代码如下:
ViewTreeObserver viewTreeObserver2 = mTextView.getViewTreeObserver();
viewTreeObserver2.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//需要一出监听,否则会调用多次
// viewTreeObserver2.removeGlobalOnLayoutListener(this);
Log.i("kingiyu", "MainActivity-->-->onGlobalLayout-->" + mTextView.getWidth() + "->height->" + mTextView.getHeight());
}
});
4、通过onWindowFocusChanged
onWindowFocusChanged是Activity真正可见的生命周期,执行到onWindowFocusChanged,控件才能和用户进行交互,因此在onWindowFocusChanged时控件已经绘制完成,可以通过View.getHeight和View.getWidth获取控件位置和宽高。代码如下:
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
int height = mTextView.getHeight();
int width = mTextView.getWidth();
Log.i("kingiyu", "MainActivity-->-->onWindowFocusChanged-->" + width + "->height:->" + height);
}
总结
方法一通过MeasureSpec直接测量需要View设置为wrap_content
方法二和方法三通过ViewTreeObserver监听ViewTree,当获得正确的宽高后,请移除这个观察者,否则回调会多次执行
方法四代码简单,我比较推荐
几种方法测试结果:
各种测量方法测试结果
网友评论