9

在我的应用程序中,我有一个元素需要用户在屏幕上四处移动,为此我使用的是 RelativeLayout 和 onTouchListener。

我遇到的问题是,在我的内部,我对andonTouchListener得到了一些奇怪的结果。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;    
    }
};
4

3 回答 3

8

我能够通过使用event.getRawX(), 和来解决这个问题event.getRawY()

于 2013-04-29T17:06:07.933 回答
3

处理 ACTION_MOVE 事件后,您是否在 onTouch() 中返回 true?此外,正如 Android 官方参考解释的那样,“为了提高效率,运动事件可能会在一个对象中将多个运动样本批处理在一起”。因此,您应该只使用 getX() 和 getY() 来检索最后一个坐标。要访问较早的坐标,您可以使用方法 getHistoricalX(int) 和 getHistoricalY(int)。更多信息,请阅读官方参考。

于 2013-04-29T08:59:04.703 回答
2

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.

背后的原因

@马特克拉克回答

于 2014-12-16T07:42:43.953 回答