在onCreate中去获取View的长度和宽度是无效的,view.getWidth()和view.getHeight()都是0,这是因为此时界面还处于不可见状态,View还没有绘制出来,无法正确获得尺寸。但有时我们需要尽早的获取到View的长宽来进行一些操作,这个时候下面的一些方法是可行的:
- 测量方法:
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); int height = view.getMeasuredHeight(); int width = view.getMeasuredWidth();
- 组件绘制之前监听
ViewTreeObserver vto =view.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { int height =view.getMeasuredHeight(); int width =view.getMeasuredWidth(); return true; } });
-
整体布局监听
ViewTreeObserver vto = view.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){ @Override public void onGlobalLayout() { view.getViewTreeObserver().removeGlobalOnLayoutListener(this); int height =view.getMeasuredHeight(); int width =view.getMeasuredWidth(); } });
-
如果是自定义的view,可以在onSizeChange回调函数中获取并保存长和宽
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); height = h; width = w; }