如何确定 MotionEvent 是相对坐标系还是绝对坐标系?

37

我正在实现 OnTouchListener ,并且正在接收 MotionEvent 对象。一些 ACTION_MOVE 事件报告绝对 X/Y 坐标,而另一些报告相对坐标。

如何获取 MotionEvent 目前表示的坐标类型?

4个回答

70

您可能想要使用以下方法来获取绝对坐标(即相对于设备屏幕的绝对坐标):

MotionEvent.getRawX()

MotionEvent.getRawY()

而其他方法 getX()getY() 则会返回相对于调度它们的 View 的坐标。


7
我已经通过使用getRawX()和getRawY()解决了我的问题。然而,我认为这是一个令人沮丧的解决方案,因为它表明getX()和getY()是无用的,尽管它们应该是MotionEvent类的主要方法。一定有更加优雅的解决方案。 - PeyloW
1
太好了,你帮我避免了未来的麻烦。 - Tom
Peylow - motionEvent.getRawX() 只返回视图内的绝对坐标。它不会返回视图外的坐标。要获取视图外的坐标,必须将 ACTION_DOWN 事件的绝对坐标添加到相应的 ACTION_MOVE 或 ACTION_UP MotionEvent 的相对坐标中。 - Ian

37

这是Android平台的一个限制。

MotionEvent有时会返回相对于视图的绝对X和Y坐标,有时会返回相对于前一次运动事件的相对坐标。

发送为ACTION_DOWN的事件将始终是绝对坐标,而所有其他事件将有所变化。无法询问MotionEvent当前的坐标类型。

这意味着在实践中,getX()getY()对于许多用例来说是无用的,您应该基于getRawX()getRawY()来构建应用程序逻辑,它保证返回相对于设备屏幕的绝对坐标。


3
这是否仍然适用?我发现使用getX和getY可以很好地处理相对坐标... - jjxtra

4

0

我找到了一种不需要原始坐标的方法。

getX() 和 getY() 应该返回相对于派发它们的视图的坐标。

这是正确的。但通常我们想要相对于容器视图而不是派发视图的坐标。

float xRelativeToParent = view.getX() + motionEvent.getX();
float yRelativeToParent = view.getY() + motionEvent.getY();

然后,要将触摸视图的中心移动到移动指针位置,请执行以下操作:

view.setX(xRelativeToParent - view.getWidth()/2f);
view.setY(yRelativeToParent - view.getHeight()/2f);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接