Java Android onTouchEvent坐标跳跃
在我的应用程序中,我有一个元素要求用户在屏幕上移动它,为此我使用了RelativeLayout和onTouchListener 我遇到的问题是,在我的Java Android onTouchEvent坐标跳跃,java,android,touch,touch-event,ontouchlistener,Java,Android,Touch,Touch Event,Ontouchlistener,在我的应用程序中,我有一个元素要求用户在屏幕上移动它,为此我使用了RelativeLayout和onTouchListener 我遇到的问题是,在我的onTouchListener中,我得到了一些关于getX()和getY()的奇怪结果 我在我的onTouch()->ACTION\u MOVE块中添加了以下代码行: Log.v(“示例”,“触摸:{x:+event.getX()+”}{y:+event.getY()+”}”) 下面是我的LogCat结果 04-29 03:16:11.000:V/
onTouchListener
中,我得到了一些关于getX()
和getY()
的奇怪结果
我在我的onTouch()
->ACTION\u MOVE
块中添加了以下代码行:
Log.v(“示例”,“触摸:{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;
}
};
在处理ACTION\u MOVE事件后,是否在onTouch()中返回true?
此外,正如Android官方参考文件所解释的,“为了提高效率,运动事件可能会在单个对象内将多个运动样本批处理在一起”。因此,应该只使用getX()和getY()来检索最后一个坐标。要访问早期坐标,可以使用getHistoricalX(int)和getHistoricalY(int)方法。
有关更多信息,请阅读我可以通过使用事件.getRawX()
和事件解决此问题。getRawY()
运动事件有时会返回相对于视图的绝对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 answerI确实返回true
:添加了代码。我在上面添加了代码。我返回true,我不确定为什么需要历史值。拖动时是否只使用一个手指?可能尝试记录事件。getPointerCount()。你确定你的侦听器只侦听一个视图的事件吗?我很快就会尝试,但是我通过使用event.getRawX()
和event.getRawY()
解决了我的问题。好的,非常好,更好!!!也许在使用getX和getY以及相对坐标时会出现一些问题。谢谢,我也遇到了同样的问题,这真的很有帮助。