【问题标题】:Android - correct for height of status bar in onTouchEvent()Android - 更正 onTouchEvent() 中状态栏的高度
【发布时间】:2012-12-13 04:07:32
【问题描述】:

我在onTouchEvent(MotionEvent event) 的自定义视图中响应触摸事件。我遇到了坐标不一致的问题:event.getRaw(Y) 返回包括状态栏在内的触摸的 Y 坐标,但 myView.getTop() 返回不包括状态栏的视图顶部的 Y 坐标。我采用了以下技巧来纠正状态栏的高度:

// Get the size of the visible window (which excludes the status bar)
Rect rect = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);

// Get the coordinates of the touch event, subtracting the top margin
final int x = (int) event.getRawX();
final int y = (int) event.getRawY() - rect.top;

有没有更好的解决方案?

【问题讨论】:

  • 您希望最终的 X/Y 值采用什么形式?包括状态栏,排除它们,还是相对于接收到触摸事件的父视图?
  • 排除状态栏。例如,我的自定义视图从 y=0 开始,所以我希望该视图的最顶部是 y=0 而不是 y=38 或其他东西。
  • 在这种特殊情况下,为什么 getX 和 getY 不适合您,因为它们是相对于视图的左上角的?

标签: android statusbar touch-event


【解决方案1】:

如果您只关心相对于父视图的坐标(例如,您希望始终假设视图的左上角为 0,0),您可以只使用 getX() 和 getY() 而不是它们原始等价物。

否则,基本上你会尝试获取相对于屏幕的 X/Y(getRawX、getRawY)并将它们转换为相对于窗口的 X/Y 坐标(状态栏不是窗口的一部分)。

您当前的解决方案将起作用,但 as discussed elsewhere, getWindowVisibileDisplayFrame 过去曾被轻微破坏。更安全的方法可能是确定视图在窗口中的位置,然后使用相对于该视图的 x/y 坐标。

int[] coords = new int[2];
myView.getLocationInWindow(coords);

final int x = event.getRawX() - coords[0];
final int y = event.getRawY() - coords[1];

【讨论】:

  • 这很好用!我应该澄清一下,我是从 myView 是孩子的活动中访问它,所以 getX() 和 getRawX() 给出相同的结果(我猜是因为活动填满了屏幕)?如果 myView 周围有边距,则我的代码不正确,但您的代码正确。
  • 在我输入算术错误时修改。它是 getX 加上 getLocationInWindow,而不是 getRawX + getLocationInWindow :)
  • 您绝对必须减去坐标而不是添加坐标。例如,如果 event.getX() 是 70 并且 myView 左侧的 x 坐标是 coords[0] = 50,那么你想要 x = 20。在这种情况下,getX 是否无关紧要() 或 getRawX() 被使用,所以我只是使用 getRawX() 来提醒自己这些是原始值。
  • 啊,好吧。我稍微误解了您要查找的坐标:) 我把它们改回来了。
猜你喜欢
  • 2011-03-25
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多