1

我在自定义视图中响应触摸事件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;

有更好的解决方案吗?

4

1 回答 1

4

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

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

您当前的解决方案将起作用,但正如其他地方所讨论的那样,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];
于 2012-12-27T20:41:48.653 回答