Android多点触控 - 秒指ACTION.MOVE被忽略

Nat*_*ist 20 java android multi-touch

以下代码是我一直尝试用于多点触控的代码.手指一被正确设置并在我拖动手指时四处移动.当我触摸并松开手指时,手指2会显示并消失,但它从不会四处移动.知道什么是错的吗?

我读过开发者博客我仍然不明白问题是什么.

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction() & MotionEvent.ACTION_MASK;
        int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
        int pointerId = event.getPointerId(pointerIndex);
        switch (action) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN:
            if (pointerId == 0)
            {
                fingerOneDown = 1;
                fingerOneX = event.getX(pointerIndex);
                fingerOneY = event.getY(pointerIndex);
            }
            if (pointerId == 1)
            {
                fingerTwoDown = 1;
                fingerTwoX = event.getX(pointerIndex);
                fingerTwoY = event.getY(pointerIndex);
            }
            break;

        case MotionEvent.ACTION_UP:          
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_CANCEL:
            if (pointerId == 0)
            {
                fingerOneDown = 0;
                fingerOneX = event.getX(pointerIndex);
                fingerOneY = event.getY(pointerIndex);
            }
            if (pointerId == 1)
            {
                fingerTwoDown = 0;
                fingerTwoX = event.getX(pointerIndex);
                fingerTwoY = event.getY(pointerIndex);
            }
            break;

        case MotionEvent.ACTION_MOVE:
            if (pointerId == 0)
            {
                fingerOneDown = 1;
                fingerOneX = event.getX(pointerIndex);
                fingerOneY = event.getY(pointerIndex);
            }
            if (pointerId == 1)
            {
                fingerTwoDown = 1;
                fingerTwoX = event.getX(pointerIndex);
                fingerTwoY = event.getY(pointerIndex);
            }

            break;
        }
        return true;
    }
Run Code Online (Sandbox Code Playgroud)

Nat*_*ist 32

没关系.我修好了它.由于某些奇怪的原因,ACTION.MOVE事件总是因为pointerId而变为零.因此,您必须重新计算事件中的pointerId,如下所示:

       case MotionEvent.ACTION_MOVE:

        int pointerCount = event.getPointerCount();
        for(int i = 0; i < pointerCount; ++i)
        {
            pointerIndex = i;
            pointerId = event.getPointerId(pointerIndex);
            Log.d("pointer id - move",Integer.toString(pointerId));
            if(pointerId == 0)
            {
                fingerOneDown = 1;
                fingerOneX = event.getX(pointerIndex);
                fingerOneY = event.getY(pointerIndex);
            }
            if(pointerId == 1)
            {
                fingerTwoDown = 1;
                fingerTwoX = event.getX(pointerIndex);
                fingerTwoY = event.getY(pointerIndex);
            }
        }
        break;
Run Code Online (Sandbox Code Playgroud)

  • 刚刚遇到这个,我不得不说它很合乎逻辑.POINTER DOWN/UP是一个简单的事件,可以作为单独的事件触发.然而,MOVE与每个指针有关.将指针移动分成不同的事件会使事情变得非常复杂甚至是不可能的(区分多指针滑动和单指滑动同时在一个地方保持第二指针).因此,*动作指数*不会使MOVE意识,你需要手动检查指针的移动通过迭代(如您已显示)和存储的历史(检查是哪一个移动). (7认同)