ClickListener touchDragged указатель всегда ноль - PullRequest
0 голосов
/ 03 марта 2020

во время работы над классом слушателя и реализации обработки нескольких жестов касания я натолкнулся на возможную ошибку.

Реализация кода

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

При касании экрана новым и, удерживая старый палец на экране, указатель указателя увеличивается. В результате получается следующий журнал:

Listener: touch down0
Listener: touch down1

Если я затем проведу двумя пальцами по экрану, он вызовет только событие touchDragged с всегда указывающим нулем pointerIndex. Несмотря на то, что жест touchDown говорит, что у него есть indexIndex, равный 1. Журнал touchDragged всегда:

Listener: dragged 0
Listener: dragged 0

Я думаю, что это может быть ошибкой в ​​коде LibGDX, поскольку такой простой кусок кода действительно не может go ошибаться.

1 Ответ

1 голос
/ 03 марта 2020

Я думал, что внимательно прочитал документацию по 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) возвращает значение true, только если pointerIndex равен 0. Объясняя причину, по которой события touchDragged не инициировались для pointerIndex> 0.

Простое решение - сделать так, чтобы touchDown всегда возвращалось true

...