我所理解的是getLocationOnScreen
从屏幕左上角的Y轴返回状态栏高度(或动作栏或标题栏?)的位置。
getLocationInWindow
从活动的根内容视图的左上角返回位置。
现在,一切似乎都有道理。但是当我尝试使用getLocationOnScreen
和getLocationInWindow
获取位置时,它们都会返回按钮的相同位置,并添加状态栏的高度。 getLocationOnScreen
似乎是正确的,但getLocationInWindow
似乎错了。
有什么我想念的吗?还是它的马车?我在API-4和API-14中对此进行了测试。
答案 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)
...
}
这在下图中进一步说明,其中蓝色表示屏幕&红色表示窗口:
重要的是要注意窗口可以是您的顶级窗口(覆盖整个屏幕),或其他自定义窗口,如对话框。
所以,回到你的问题:
getLocationOnScreen返回添加了状态栏高度的位置
没错。您手机的屏幕包含状态栏的视图
getLocationOnScreen和getLocationInWindow,它们都返回添加了状态栏高度的按钮的相同位置
这是因为您正在使用的窗口是覆盖整个手机屏幕的顶级窗口。
答案 1 :(得分:0)
此问题已在此处提出:getLocationOnScreen() vs getLocationInWindow()虽然接受的答案不正确,但正如@groucho所述。
我可以复制他的答案,但我认为如果你在那里检查它会更好!