我正在实现 OnTouchListener
,并且正在接收 MotionEvent 对象。一些 ACTION_MOVE
事件报告绝对 X/Y 坐标,而另一些报告相对坐标。
如何获取 MotionEvent
目前表示的坐标类型?
您可能想要使用以下方法来获取绝对坐标(即相对于设备屏幕的绝对坐标):
而其他方法 getX()
和 getY()
则会返回相对于调度它们的 View
的坐标。
这是Android平台的一个限制。
MotionEvent
有时会返回相对于视图的绝对X和Y坐标,有时会返回相对于前一次运动事件的相对坐标。
发送为ACTION_DOWN
的事件将始终是绝对坐标,而所有其他事件将有所变化。无法询问MotionEvent
当前的坐标类型。
这意味着在实践中,getX()
和getY()
对于许多用例来说是无用的,您应该基于getRawX()
和getRawY()
来构建应用程序逻辑,它保证返回相对于设备屏幕的绝对坐标。
我找到了一种不需要原始坐标的方法。
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);