onTouchEvent返回多个指针的相同坐标

时间:2013-11-25 12:43:14

标签: java android multi-touch ontouchevent

我目前正在开发我的第一个多点触控Android应用程序,而且我在使用onTouchEvent()时遇到了一些困难。我已经使用了在线教程中的一些代码,它似乎为我在屏幕上的每次触摸提供了正确的指针ID信息,但ACTION_POINTER_DOWN事件的事件坐标似乎总是与初始触摸的坐标相同。我的代码如下:

private int getIndex(MotionEvent event) {
          int idx = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
          return idx;
}

@Override

public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction() & MotionEvent.ACTION_MASK;
        switch(action) {
                case MotionEvent.ACTION_DOWN : {
                        int id = event.getPointerId(0);
                        Log.d("CV", "Point number " +id+ " is down at X value " +event.getX());
                        callbackListener.onTouchDown(event, id);
                        break;
                }
                case MotionEvent.ACTION_MOVE : {
                        int touchCounter = event.getPointerCount();
                        for (int t = 0; t < touchCounter; t++) {
                                int id = event.getPointerId(t);
                                callbackListener.onMove(event, id);
                        }
                        break;
                }
                case MotionEvent.ACTION_POINTER_DOWN : {
                        int id = event.getPointerId(getIndex(event));
                        Log.d("CV", "Point number " +id+ " is down at X value " +event.getX());
                        callbackListener.onTouchDown(event, id);
                        break;
                }
                case MotionEvent.ACTION_POINTER_UP : {
                        int id = event.getPointerId(getIndex(event));
                        //Log.d("CV", "Other point up ["+id+"]");
                        callbackListener.onTouchUp(event, id);
                        break;
                }
                case MotionEvent.ACTION_UP : {
                        int id = event.getPointerId(0);
                        //Log.d("CV", "Pointer up ["+id+"]");
                        callbackListener.onTouchUp(event, id);
                        break;
                }
        }
        return true;
}

在显示我的指针X位置的日志中,您可以看到当我向屏幕添加额外触摸(指针编号1)时,X坐标与第一次触摸(指针编号0)相同。 ..

11-25 12:34:02.911: D/CV(25231): Point number 0 is down at X value 260.60608
11-25 12:34:05.281: D/CV(25231): Point number 0 is down at X value 477.57578
11-25 12:34:06.261: D/CV(25231): Point number 0 is down at X value 581.8182
11-25 12:34:11.891: D/CV(25231): Point number 0 is down at X value 267.87878
11-25 12:34:13.321: D/CV(25231): Point number 1 is down at X value 267.87878

这令我感到沮丧,因为我几乎从在线教程中复制并粘贴了整个内容,我无法理解为什么它无法正常工作!另外,正如您可以想象的那样,ACTION_MOVE也无法正常工作......

非常感谢任何帮助,谢谢

1 个答案:

答案 0 :(得分:1)

这是因为event.getX()返回first指针索引的值。

您应该使用getX(int pointerIndex),如下所示:

Log.d("CV", "Point number " +id+ " is down at X value " +event.getX(getIndex(event)));