Android onTouchEvent坐标跳过

我的应用程序,我有一个要求用户在屏幕上移动它的元素,并执行此操作我使用RelativeLayout和onTouchListener。

我遇到的问题是在我的onTouchListener里面, getX()getY()得到了一些奇怪的结果。

我将下面这行代码添加到我的onTouch() – > ACTION_MOVE块中:

Log.v("example", "Touch: {x:" + event.getX() + " } {y:" + event.getY() + "}");

以下是我的LogCat结果。

04-29 03:16:11.000:V / myApp(24188):触摸!
04-29 03:16:11.057:V / myApp(24188):Touch:{x:69.78699} {y:107.774216}
04-29 03:16:11.103:V / myApp(24188):Touch:{x:77.86926} {y:173.37648}
04-29 03:16:11.158:V / myApp(24188):Touch:{x:69.78699} {y:108.781845}
04-29 03:16:11.205:V / myApp(24188):Touch:{x:77.86926} {y:174.38597}
04-29 03:16:11.463:V / myApp(24188):Touch:{x:69.78699} {y:109.64778}
04-29 03:16:11.502:V / myApp(24188):Touch:{x:77.86926} {y:175.62172}
04-29 03:16:11.596:V / myApp(24188):Touch:{x:69.23099} {y:109.40666}
04-29 03:16:11.654:V / myApp(24188):触摸!

正如你所看到的,我的手指在一条直线上的移动非常缓慢,我得到了一个跳跃的结果,其中正确的坐标实际上是隔行的。

这导致我的视​​图在所需的位置和偏移位置之间跳转,并在屏幕上拖动。

我已经添加了检查,以确保我只创build一个单一的元素,这个侦听器不是从这个单一的视图以外的任何地方被调用。

有没有其他人看过这个问题之前,有什么我可以做什么来解决它的见解?

编辑

 View.OnTouchListener onTouch = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Log.d("example", "Touch down"); break; case MotionEvent.ACTION_UP: Log.d("example", "Touch up"); break; case MotionEvent.ACTION_MOVE: Log.v("example", "Touch: {x:" + event.getX() + " } {y:" + event.getY() + "}"); } return true; } }; 

Solutions Collecting From Web of "Android onTouchEvent坐标跳过"

我可以通过使用event.getRawX()event.getRawY()来解决这个问题。

在处理ACTION_MOVE事件之后,你在onTouch()中返回true吗? 而且,正如“Android官方参考”所解释的那样,“对于高效的运动事件,可以将单个对象内的多个运动样本进行批处理”。 所以你应该使用getX()和getY()来检索最后的坐标。 要访问先前的坐标,可以使用方法getHistoricalX(int)和getHistoricalY(int)。 欲了解更多信息,请阅读官方参考。

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

 getRawX() and getRawY() that is guaranteed to return absolute coordinates, relative to the device screen. While getX() and getY(), should return you coordinates, relative to the View, that dispatched them. 

背后的原因

@Matt Clark回答