在侦听器类上实现多个触摸手势的处理时,我遇到了一个可能的错误。

代码实现

public class MyListener extends ClickListener {
    private List<Pointer> pointers = new ArrayList<Pointer>();

    @Override
    public boolean touchDown(InputEvent event, float x, float y, int pointerIndex, int button) {
        System.out.println("Listener: touch down" + pointerIndex);
        pointers.add(new ListenerPointer(x, y, button));
        event.handle();
        return super.touchDown(event, x, y, pointerIndex, button);
    }

    @Override
    public void touchDragged(InputEvent event, float x, float y, int pointerIndex) {
        System.out.println("Listener: dragged " + pointerIndex);

        // Update the current point the user is dragging.
        for (ListenerPointer pointer : pointers) {
            if (pointer.getPointerIndex() == pointerIndex) {
                pointer.update(x, y);
                event.handle();
            }
        }
    }
}


当用新手指在屏幕上触碰并仍旧握住屏幕上的手指时,indexPointer会增加。产生以下日志:

Listener: touch down0
Listener: touch down1


如果然后在屏幕上移动两只手指,则只会触发touchDragged事件,而pointerIndex始终为零。即使touchDown手势表示它的指标指标为1。touchDragged的日志始终为:

Listener: dragged 0
Listener: dragged 0


我认为这可能是LibGDX代码中的错误,因为这样简单的代码实际上并不会出错。

最佳答案

我以为我已经仔细阅读了touchDragged的文档,但是我真是个傻瓜。它指出以下内容:

Called when a mouse button or a finger touch is moved anywhere, but only if touchDown previously returned true for the mouse button or touch.

我猜想super.touchDown(event, x, y, pointerIndex, button)仅在pointerIndex为0时才返回true。解释了为什么pointerIndex> 0不会触发touchDragged事件的原因。

简单的解决方法是使touchDown始终返回true

10-08 07:50