Android 如何获取View的高宽、坐标

本文介绍了在Android开发中获取视图元素坐标及尺寸的方法,包括使用view.post(Runnable)、延时获取和注册ViewTreeObserver观察者的三种实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 前言

    之前在做动画的时候, 想要获取一下button的坐标的时候, 直接在onCreate里调用button的getX(),getY()方法, 但是返回的结果是0, 后来上网找到了一些方法, 以此谨记.

  • view.post(Runnable)

    我们调用的这个post方法是在view测量完之后, 所以才会获取的到

    mBtn.post(new Runnable() {
            @Override
            public void run() {
                mBtnY = mBtn.getY();
                mBtnX = mBtn.getX();
                Log.d("xxx", "x: " + mBtnX);
                Log.d("xxx", "y: " + mBtnY);
                Log.d("xxx", "height: " + mBtn.getHeight());
                Log.d("xxx", "width: " + mBtn.getWidth());
            }
        });

    log信息

    D/xxx: x: 810.0
    D/xxx: y: 1446.0
    D/xxx: height: 195
    D/xxx: width: 195
  • 延时获取

    这个方法跟上面的类似, 感觉没有上面的把握的精准

    new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (this){
                    try {
                        wait(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    mBtnY = mBtn.getY();
                    mBtnX = mBtn.getX();
                    Log.d("xxx", "x: " + mBtnX);
                    Log.d("xxx", "y: " + mBtnY);
                    Log.d("xxx", "height: " + mBtn.getHeight());
                    Log.d("xxx", "width: " + mBtn.getWidth());
                }
            }
        }).start();

    打印的信息同上

  • ViewTreeObserver

    这个方法感觉是比较好的一种方式, 注册监听视图树的观察者, 在视图树中全局事件改变时得到通知.

    mBtn.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                mBtn.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                mBtnY = mBtn.getY();
                mBtnX = mBtn.getX();
                mScreenHeight += mBtnY;
                Log.d("xxx", "x: " + mBtnX);
                Log.d("xxx", "y: " + mBtnY);
                Log.d("xxx", "height: " + mBtn.getHeight());
                Log.d("xxx", "width: " + mBtn.getWidth());
            }
        });

    注: 这个方法是api16以上用的

Android 中,可以使用 `View` 的 `OnLayoutChangeListener` 接口来监听屏幕高宽变化。具体做法如下: 1. 首先,在需要监听屏幕尺寸变化的 `View` 中添加 `OnLayoutChangeListener` 监听器: ```java view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { // 处理屏幕尺寸变化的逻辑 } }); ``` 2. 在 `onLayoutChange` 方法中处理屏幕尺寸变化的逻辑。 例如,你可以通过 `View` 的 `getWidth()` 和 `getHeight()` 方法获取当前的屏幕宽度和高度: ```java int width = view.getWidth(); int height = view.getHeight(); ``` 或者,你也可以通过 `View` 的 `getLayoutParams()` 方法获取 `LayoutParams` 对象,然后再从中获取宽度和高度: ```java ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); int width = layoutParams.width; int height = layoutParams.height; ``` 注意,当屏幕尺寸变化时,`onLayoutChange` 方法会被多次调用。因此,你需要根据实际情况决定在何时执行相应的逻辑。 另外,如果你想监听整个屏幕的高宽变化,可以在 `Activity` 或 `Fragment` 的 `onCreate` 方法中添加全局的 `OnLayoutChangeListener` 监听器: ```java getWindow().getDecorView().getRootView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { // 处理屏幕尺寸变化的逻辑 } }); ``` 这样,当整个屏幕的高宽发生变化时,上述监听器的 `onLayoutChange` 方法会被调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值