获取View宽高的几种方法?

参考回答

在 Android 开发中,获取 View 的宽高是一个常见的需求。不同的时机和场景下,获取宽高的方式有所不同。以下是几种常用的方法:

  1. 通过 getWidth()getHeight() 获取
    getWidth()getHeight()View 类提供的常规方法,可以直接获取视图的宽度和高度。

    • 适用场景:视图已经完成布局,并且已经被绘制出来。
    int width = view.getWidth();
    int height = view.getHeight();
    
    Java
  2. 通过 ViewTreeObserver.OnPreDrawListener 获取
    在布局阶段,可以通过 ViewTreeObserver.OnPreDrawListener 来监听视图绘制的时机,在绘制前获取视图的宽高。

    • 适用场景:在布局完成前或者视图树发生变化时获取宽高。
    view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
       @Override
       public boolean onPreDraw() {
           int width = view.getWidth();
           int height = view.getHeight();
           return true;  // 继续绘制
       }
    });
    
    Java
  3. onLayout() 中获取
    onLayout()View 布局完成后会被调用的生命周期方法,此时可以安全地获取视图的宽高。

    • 适用场景:在视图布局完成后获取宽高,适合在自定义视图中使用。
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
       int width = r - l;
       int height = b - t;
    }
    
    Java
  4. 通过 post() 方法获取
    post()View 类提供的方法,它将一个 Runnable 放入消息队列中,保证在布局完成后执行。通过这种方式可以延迟获取宽高,直到视图已经完成布局。

    • 适用场景:视图布局完成后获取宽高。
    view.post(new Runnable() {
       @Override
       public void run() {
           int width = view.getWidth();
           int height = view.getHeight();
       }
    });
    
    Java
  5. 通过 onSizeChanged() 获取
    onSizeChanged()View 类的一个回调方法,它在视图的大小发生变化时被调用。在这里可以获取视图的宽高。

    • 适用场景:视图尺寸发生变化时获取宽高。
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
       super.onSizeChanged(w, h, oldw, oldh);
       int width = w;
       int height = h;
    }
    
    Java

详细讲解与拓展

1. getWidth()getHeight() 获取

getWidth()getHeight() 是最常用的获取视图宽高的方法,但它们的返回值只有在视图布局完成并且显示时才有效。因此,在视图布局阶段使用它们时,可能会获取到 0 或者不准确的值。

2. ViewTreeObserver.OnPreDrawListener

这种方法的优势在于,它允许你在布局前或视图树变化时获取视图的宽高。它能在视图的绘制阶段监听到布局,并提前知道视图的尺寸。这种方式常用于需要在视图绘制之前获得一些布局信息的场景。

3. onLayout() 获取

onLayout() 方法中获取视图的宽高是一个非常可靠的方式,因为它是在视图完成布局后调用的。此时,所有的尺寸计算已经完成,可以直接获取到视图的宽高。

4. post() 延迟获取

post() 方法通过将任务延迟到下一帧来执行,因此可以保证在布局完成之后获取视图的宽高。它适合那些无法确保视图立即完成布局的场景,例如在 ActivityonCreate() 中,或者动态添加视图后立即获取宽高时。

5. onSizeChanged() 获取

onSizeChanged() 会在视图的大小发生变化时被调用,因此它适用于监听视图尺寸变化并根据变化做出响应的场景。比如当屏幕旋转、视图大小发生变化时,可以在这里获取新的宽高。

总结

获取 View 的宽高有多种方式,常见的有:
1. getWidth()getHeight():适用于视图已布局完成的场景。
2. ViewTreeObserver.OnPreDrawListener:用于布局前获取宽高。
3. onLayout():适用于自定义视图布局完成后获取宽高。
4. post():用于布局完成后的延迟获取。
5. onSizeChanged():用于监听视图尺寸变化时获取宽高。

根据不同的需求和场景,可以选择合适的方式来获取 View 的宽高。

发表评论

后才能评论