getLocationInWindow和getLocationOnScreen之间的混淆

时间:2013-11-22 06:04:00

标签: android

我所理解的是getLocationOnScreen从屏幕左上角的Y轴返回状态栏高度(或动作栏或标题栏?)的位置。

getLocationInWindow从活动的根内容视图的左上角返回位置。

现在,一切似乎都有道理。但是当我尝试使用getLocationOnScreengetLocationInWindow获取位置时,它们都会返回按钮的相同位置,并添加状态栏的高度。 getLocationOnScreen似乎是正确的,但getLocationInWindow似乎错了。

有什么我想念的吗?还是它的马车?我在API-4和API-14中对此进行了测试。

2 个答案:

答案 0 :(得分:2)

尽管之前已经回答过这个问题,但我认为仍然值得努力使这个问题更加清晰。

如果你看一下getLocationOnScreen和getLocationInWindow的代码:

public void getLocationOnScreen(int[] outLocation) {
    // It calls the getLocationInWindow
    getLocationInWindow(outLocation);

    // and adjust accordingly in case the window is not the top-level window 
    final AttachInfo info = mAttachInfo;
    if (info != null) {
        outLocation[0] += info.mWindowLeft; // refer image below
        outLocation[1] += info.mWindowTop; // refer image below
    }
}

public void getLocationInWindow(int[] outLocation) {
    // do my calculation here 
    // by traversing views contained in this window (in a single tree of views) 
    ...
}

这在下图中进一步说明,其中蓝色表示屏幕&红色表示窗口:

enter image description here

重要的是要注意窗口可以是您的顶级窗口(覆盖整个屏幕),或其他自定义窗口,如对话框。

所以,回到你的问题:

  

getLocationOnScreen返回添加了状态栏高度的位置

没错。您手机的屏幕包含状态栏的视图

  

getLocationOnScreen和getLocationInWindow,它们都返回添加了状态栏高度的按钮的相同位置

这是因为您正在使用的窗口是覆盖整个手机屏幕的顶级窗口。

答案 1 :(得分:0)

此问题已在此处提出:getLocationOnScreen() vs getLocationInWindow()虽然接受的答案不正确,但正如@groucho所述。

我可以复制他的答案,但我认为如果你在那里检查它会更好!