我的应用程序,我有一个元素,要求用户在屏幕上移动它,为此我使用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):触摸:{x:69.78699} {y:107.774216} 04-29 03:16:11.103:V / myApp(24188):触摸:{x:77.86926} {y:173.37648} 04-29 03:16:11.158:V / myApp(24188):触摸:{x:69.78699} {y:108.781845} 04-29 03:16:11.205:V / myApp(24188):触摸:{x:77.86926} {y:174.38597} 04-29 03:16:11.463:V / myApp(24188):触摸:{x:69.78699} {y:109.64778} 04-29 03:16:11.502:V / myApp(24188):触摸:{x:77.86926} {y:175.62172} 04-29 03:16:11.596:V / myApp(24188):触摸:{x:69.23099} {y:109.40666} 04-29 03:16:11.654:V / myApp(24188):触摸起来!
正如你所看到的,我的手指在一条直线上非常缓慢地移动,我得到一个跳跃的结果,其中正确的坐标实际上是每隔一行。
当我将其拖过屏幕时,这导致我的视图在所需位置和偏移位置之间跳回和第四。
我已经添加了检查以确保我只创建一个单独的元素,并且不会从除此单个视图之外的任何位置调用此侦听器。
有没有其他人之前看过这个问题,并且对我能做些什么来解决它有任何见解?
编辑
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;
}
};
我能够通过使用event.getRawX()
和event.getRawY()
来解决这个问题。
在处理ACTION_MOVE事件后,你在onTouch()内部返回true吗?此外,正如Android官方参考资料所解释的那样,“效率运动事件可以在一个对象中将多个运动样本一起批量处理”。所以你应该只使用getX()和getY()来检索最后的坐标。要访问早期坐标,可以使用方法getHistoricalX(int)和getHistoricalY(int)。有关更多信息,请阅读the official reference.
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.
背后的原因