Android onTouchEvent坐标跳过

时间:2013-04-29 07:24:25

标签: java android touch ontouchevent ontouchlistener

我是我的应用程序,我有一个元素需要用户在屏幕上移动它,为此我使用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):Touch Up!

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

当我将它拖过屏幕时,这会导致我的视​​图在所需位置和偏移位置之间跳回第四个。

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

之前有没有其他人见过这个问题,并且对我能做些什么来解决它有任何见解?

修改

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;    
    }
};

3 个答案:

答案 0 :(得分:8)

我可以使用event.getRawX()event.getRawY()来解决此问题。

答案 1 :(得分:3)

处理完ACTION_MOVE事件后,你在onTouch()内部返回true吗? 此外,正如Android官方参考资料所解释的那样,“效率运动事件可以在一个对象中将多个运动样本一起批量处理”。所以你应该只使用getX()和getY()来检索最后的坐标。要访问早期坐标,可以使用方法getHistoricalX(int)和getHistoricalY(int)。 有关更多信息,请阅读the official reference.

答案 2 :(得分: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.

背后的原因

@Matt Clark回答