来自getLocationOnScreen / getLocationInWindow的坐标不正确

时间:2010-04-14 14:47:26

标签: android android-widget

getLocationOnScreen()getLocationInWindow()的调用都会给我一个约{30}的top/Y坐标(状态/通知栏的高度)太远了。 left/X坐标已经死了。

正如我上面所暗示的那样,我认为差异是由于状态/通知栏...我可能是错的。如果我能确定通知栏的大小,我想我可以解决这个问题,但是,我很难做到这一点。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:81)

我最终通过确定状态/通知栏的高度来解决这个问题,如下所示:

View globalView = ...; // the main view of my activity/application

DisplayMetrics dm = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(dm);
int topOffset = dm.heightPixels - globalView.getMeasuredHeight();

View tempView = ...; // the view you'd like to locate
int[] loc = new int[2]; 
tempView.getLocationOnScreen(loc);

final int y = loc[1] - topOffset;

答案 1 :(得分:7)

以下是我喜欢获取状态栏高度的方法,并调整偏移量:

final int[] location = new int[2];
anchor.getLocationInWindow(location); // Includes offset from status bar, *dumb*
Rect anchorRect = new Rect(location[0], location[1],
        location[0] + anchor.getWidth(), location[1] + anchor.getHeight());

anchor.getRootView().findViewById(android.R.id.content).getLocationInWindow(location);
int windowTopOffset = location[1];
anchorRect.offset(0, -windowTopOffset);

答案 2 :(得分:5)

我遇到同样的问题,请尝试使用

offset = myView.GetOffsetY();

并按该值调整Y坐标,例如

coordY -= offset;

提供``-method:

的类
class MyView extends View {

  public int GetOffsetY() {
    int mOffset[] = new int[2];
    getLocationOnScreen( mOffset );
    return mOffset[1]; 
  }

}

答案 3 :(得分:4)

此答案不包括如何获取状态栏高度,但它确实解释了getLocationOnScreen()getLocationInWindow()返回相同值的行为。

在正常活动(不是对话框)的情况下,您应该期望这两种方法返回相同的值。窗口在下面(如z顺序而非y坐标)布局状态栏,因此这些方法不能用于确定状态栏的高度。

https://stackoverflow.com/a/20154562/777165