使用getLocationInWindow或getLocationOnScreen获得View在屏幕中的坐标

本文介绍了如何使用Android中View提供的getLocationInWindow和getLocationOnScreen方法来获取控件在屏幕中的坐标。详细解释了这两种方法的区别及应用场景,并给出了示例代码。

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

在View提供了两个方法这样的方法,我们可以利用它们来获得View在屏幕中的坐标:

/**
 * <p>Computes the coordinates of this view in its window. The argument
 * must be an array of two integers. After the method returns, the array
 * contains the x and y location in that order.</p>
 *
 * @param location an array of two integers in which to hold the coordinates
 */
public void getLocationInWindow(@Size(2) int[] location)
用法如下: 
int[] location = new int[2];
view.getLocationInWindow(location);

//获取控件在window里的位置,0位表示x轴方向的坐标,说白点就是view距左边的距离,1位表示y轴的方向,是view距离顶部(包括状态栏)的位置

另一个是 :

public void getLocationOnScreen(@Size(2) int[] location) 或他的一个重载方法
public int[] getLocationOnScreen() 

关于screen我们比较好理解,就可以以为是手机屏幕,而窗体window我举例说下:比如说此视图在一个对话框里那么getLocationInWindow就是相对这个对话框的位置而言的.
关于这两个方法的调用,在oncreate或onstart是获取不到值的,在onresume可能会获取到值,当然在点击事件的时候是可以获取到值,伪代码如下:

view.post(new Runnable() {
    @Override
    public void run() {
        int[] location = new int[2];
        view.getLocationOnScreen(location);
    }
});

 最后我再把获取状态栏的方法贴出来吧,也许有人用到了

/**
     * 获得状态栏的高度
     */
    public int getStatusBarHeight(Context context) {
        int result = 0;
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId != 0) {
            result = context.getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }

有不对之处,欢迎指正^_^

<think>好的,用户想了解Androidview.getLocationOnScreen使用方法和示例。首先,我需要回忆一下这个方法的用途。根据引用[1],getLocationOnScreen用于获取视图在屏幕上的坐标。而getLocationInWindow则是相对于窗口的坐标,这可能涉及到状态栏标题栏的影响。用户可能在实际开发中需要准确定位视图的位置,比如弹出菜单自定义控件。 接下来,我需要确定如何正确使用这个方法。通常,这个方法需要一个int数组来存储x和y坐标。数组的第一个元素是横坐标,第二个是纵坐标。需要注意,这个坐标是视图左上角相对于屏幕原点的位置。引用[1]中的示例代码展示了如何调用这个方法,并获取坐标。 用户可能遇到的问题包括:为什么坐标可能不正确?可能的原因包括视图尚未完成布局,这时候在onCreate中调用会导致获取坐标为0。解决方法是在onWindowFocusChangedViewTreeObserver的回调中获取位置。引用[2]提到了在onSizeChanged中处理视图尺寸变化,这可能与布局完成后的回调有关。 另外,用户可能需要示例代码来演示实际应用,比如显示PopupWindow在指定位置。引用[3]提到了PopupWindow的实现,可以结合getLocationOnScreen来定位弹出位置。需要提醒用户注意在Activity生命周期中正确的时间点调用方法,以及处理可能的异常情况。 最后,应该总结关键点,确保用户理解坐标的参照系和调用时机的重要性。同时,提供相关问题的链接扩展阅读,帮助用户深入理解。</think>### Android View.getLocationOnScreen 使用方法及示例 #### 一、核心方法说明 `View.getLocationOnScreen(int[] outLocation)` 用于获取视图左上角在**屏幕坐标系**中的坐标: 1. 参数要求传入长度为2的整型数组 2. 计算结果: - `outLocation[0]` = 视图左上角X坐标(横轴) - `outLocation[1]` = 视图左上角Y坐标(纵轴) 注意:坐标原点(0,0)位于屏幕左上角,包含状态栏高度[^1] #### 二、基础使用示例 ```java Button myButton = findViewById(R.id.my_button); int[] location = new int[2]; myButton.getLocationOnScreen(location); int viewX = location[0]; // 屏幕坐标 int viewY = location[1]; // 屏幕坐标 Log.d("Position", "X: " + viewX + ", Y: " + viewY); ``` #### 三、典型应用场景 1. **PopupWindow 定位**(结合引用[3]) ```java // 在按钮下方显示弹出窗口 myButton.post(() -> { int[] loc = new int[2]; myButton.getLocationOnScreen(loc); PopupWindow popup = new PopupWindow(context); popup.showAtLocation(parentView, Gravity.NO_GRAVITY, loc[0], loc[1] + myButton.getHeight()); }); ``` 2. **自定义View绘制**(结合引用[2]) ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int[] pos = new int[2]; getLocationOnScreen(pos); // 根据屏幕坐标进行特殊绘制 } ``` #### 四、注意事项 1. **调用时机**:必须在视图完成布局后调用(建议在`onWindowFocusChanged``View.post()`中) 2. **坐标差异**: - 与`getLocationInWindow`的区别在于是否包含系统装饰(状态栏/标题栏) - 当应用全屏显示时两者结果相同 3. **横竖屏切换**:需要重新获取坐标 #### 五、常见问题解决 **获取坐标为0的情况**: ```java // 正确做法:在布局完成后获取 view.post(() -> { int[] loc = new int[2]; view.getLocationOnScreen(loc); // 使用有效坐标 }); ``` $$ \text{屏幕坐标系公式:}y_{\text{absolute}} = y_{\text{window}} + \text{statusBarHeight} $$
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值