在oncreate()中无论利用view.getWidth()或是view.getHeiht()还是view.getMeasuredHeight或view.getMeasuredWidth()来获取view的宽和高,看似没有问题,其实他们取得值是0,并不是你想要的结果。这是因为每个布局都要经过如下三个步骤:
- 测量:onMeasure 设置自己显示在屏幕上的宽高
- 布局:onLayout 设置自己显示在屏幕上的位置(只有在自定义ViewGroup中才用到)
- 绘制:onDraw 控制显示在屏幕上的样子(viewgroup没有这个过程)
如上的步骤是异步进行的,在oncreate()中界面处于不可见状态,内存加载组件还没有绘制出来,所以是无法获取他的尺寸。
那如何在绘制组件之前能获取到该组件的尺寸大小呢?
方法一(最常用的方法):
//手动调用测量方法。
//制定测量规则 参数表示size + mode
int width =View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
int height =View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
view.measure(width,height);
//调用measure方法之后就可以获取宽高。
int height=view.getMeasuredHeight();
int width=view.getMeasuredWidth();
方法二(设置树桩结构监听器):
ViewTreeObserver vto =view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
@Override
public void