在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;
- }