Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android onTouchEvent坐标跳跃_Java_Android_Touch_Touch Event_Ontouchlistener - Fatal编程技术网

Java Android onTouchEvent坐标跳跃

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/

在我的应用程序中,我有一个元素要求用户在屏幕上移动它,为此我使用了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/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以及相对坐标时会出现一些问题。谢谢,我也遇到了同样的问题,这真的很有帮助。