前言
有好多朋友直接在onCreate里面调用getWidth、getMeasuredWidth来获取控件的高和宽,结果呢?始终都是0!为什么呢?因为我们的控件是画出来的,当我们在执行onCreate()的方法的时候,我们的控件还没有画出来,只有执行完onCreate()方法,我们定义的控件才会被度量(measure),所以是0.
办法
既然不能直接在onCreate里面调用getWidth、getMeasuredWidth方法,那怎么获取我们控件的高和宽呢?
这里有3个办法,这里我就简单来说一下
第一种:
int w = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
imageView.measure(w, h);
int height = imageView.getMeasuredHeight();
int width = imageView.getMeasuredWidth();
这种方法会调用3次onMeasure()方法
第二种:
ViewTreeObserver vto = imageView.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
vto.removeOnPreDrawListener(this);
int height = imageView.getMeasuredHeight();
int width = imageView.getMeasuredWidth();
return true;
}
});
种方法会调两次onMeasure()方法
第三种:
ViewTreeObserver vto = imageView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
imageView.getHeight();
imageView.getWidth();
}
});
同方法二
选择
具体用哪个看实际项目吧,推荐使用方法三