onTouchListener ACTION_MOVE 不能使用超过 1 个手指

onTouchListener ACTION_MOVE not working with more than 1 finger

我正在构建一个 OpenGL ES 应用程序,我使用 onTouchListener 来检测触摸事件,正如 android 开发网站 (https://developer.android.com/training/gestures/multi#java) 所建议的那样。然后我调用其他函数来处理触摸事件。但问题是,我的其他函数告诉我第二个指针(或更多指针)永远不会调用 ACTION_MOVE。我没有在任何地方看到这个问题被提及,甚至在 Whosebug 上也没有,所以如果你知道是什么导致了这个问题,请告诉我。

代码如下:

public class GluSurfaceView extends GLSurfaceView {

    final com.glu.engine.Renderer renderer;

    @SuppressLint("ClickableViewAccessibility")
    public GluSurfaceView(Context context, AppCompatActivity main) {
        super(context);

        setEGLContextClientVersion(3);
        renderer = new com.glu.engine.Renderer(main);
        setRenderer(renderer);

        setOnTouchListener((view, motionEvent) -> {
            int ID = MotionEventCompat.getActionIndex(motionEvent);
            if(motionEvent.getActionMasked() == MotionEvent.ACTION_MOVE){
                //recorAction records a new Pointer's position
                renderer.recordAction(ID, motionEvent.getX(ID),motionEvent.getY(ID));
                Log.w("OnTouchListener","we recorded a change! "+ID+" has moved.");
                return true;
            }

            if(motionEvent.getActionMasked() == MotionEvent.ACTION_UP){
                //stopAction let's the program know that an action has stopped
                renderer.stopAction(0);
                Log.w("onTouchListener","first Action stopped");
                return true;
            }

            if(motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN){
                //startAction let's the program know to start a knew array to store Pointers positions
                renderer.startAction(0);
                renderer.recordAction(0,motionEvent.getX(0),motionEvent.getY(0));
                Log.w("onTouchListener","first Action!");
                return true;
            }
            if(motionEvent.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN){
                renderer.addPointer(ID);
                renderer.recordAction(ID,motionEvent.getX(ID),motionEvent.getY(ID));
                Log.w("onTouchListener","new Action! "+ID);
                return true;
            }
            if(motionEvent.getActionMasked() == MotionEvent.ACTION_POINTER_UP) {
                renderer.removePointer(ID);
                Log.w("onTouchListener","action "+ID+" has stopped.");
                return true;
            }
            return false;
        });
    }
}

这是日志:

E/actionManager: addedAction 0. actionNumber: 1 isTouching: true // this one is called in renderer
W/onTouchListener: first Action!
W/OnTouchListener: we recorded a change! 0 has moved.
E/actionManager: addedAction 1. actionNumber: 2 isTouching: true
W/onTouchListener: new Action! 1
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
[same thing for a while...]
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
E/actionManager: stopped action 1. actionNumber: 1 isTouching: false
W/onTouchListener: action 1 has stopped.
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
E/actionManager: stopped action 0. actionNumber: 0 isTouching: false
W/onTouchListener: first Action stopped

您可以看到 ACTION_MOVE 从未被操作 1 调用。为什么会这样?我可以修复它吗?

原来有人提到了 here。感谢@EleventhPrime。另外,经过一番思考,我不需要在系统需要时一次只更新一个指针,我可以一次更新它们!

for(int i = 0; i < motionEvent.getPointerCount(); i++) {
    int Index = motionEvent.findPointerIndex(motionEvent.getPointerId(i));
    renderer.recordAction(motionEvent.getPointerId(i), motionEvent.getX(Index), motionEvent.getY(Index));
    Log.w("OnTouchListener", "we recorded a change! " + i + " has moved.");
}