一般只有在Activity的onCreate方法执行完毕,控件才会被测量(measure)和绘制(draw),所以在onCreate中通过getWidth()和getHeight()获取控件的宽度和高度肯定都是0。但是在实际开发中有时候必须在初始化时获取宽高,常用的解决方案有三种:
方法一:
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();
textView.append("\n"+height+","+width);
方法二:
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();
textView.append("\n"+height+","+width);
方法三:
ViewTreeObserver vto = imageView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
textView.append("\n\n"+imageView.getHeight()+","+imageView.getWidth());
}
});
总结:
- 方法一: 会多调用一次onMeasure()方法,有一定的效率影响,不建议采用;
- 方法二: OnPreDrawListener回调函数会调用多次,不建议使用;
- 方法三: OnGlobalLayoutListener回调调函数会被调用两次,注意进行逻辑判断,建议采用。