GestureDetectorCompat.onScroll не вызывается в конкретном случае

У меня есть любопытный случай, когда GestureDetectorCompat.onScroll не вызывается. У меня есть SurfaceView для отображения настраиваемой карты, которая реализует GestureDetector.OnGestureListener, и в этом классе SurfaceView у меня есть два GestureDetector, один для обработки жестов в обычном режиме, а другой для обработки жестов при редактировании карты. У меня есть переменная _activeGestureDetector, которую я назначаю правильному GestureDetector в зависимости от варианта использования. Это отлично работает почти во всех случаях, кроме одного.

Обычно я переключаюсь в режим редактирования GestureDetector, когда дважды касаюсь элемента на карте, и переключаюсь обратно в обычный режим GestureDetector, когда я дважды касаюсь вне любых элементов на карте. Это работает, как ожидалось. Теперь я добавил функцию, которая переходит из режима редактирования в нормальный режим при нажатии кнопки HomeAsUp на панели инструментов. Я вижу, что детектор жестов переключается в нормальный режим GestureDetector при нажатии на кнопку «Домой», и я получаю события onTouch и событие onDown, но onScroll не вызывается, хотя я вижу в моем журнале, что onTouch получает одно событие ACTION_DOWN и множество событий ACTION_MOVE. Если я удерживаю палец и перемещаю его достаточно долго, запускается событие onLongPress (но этого не должно быть, поскольку я все время двигаю пальцем).

Такое поведение происходит только при первой попытке прокрутки после нажатия кнопки «Домой», последующие события работают нормально. Это происходит каждый раз, когда я нажимаю кнопку «Домой» для выхода из режима редактирования. То, что событие onScroll не вызывается в этом конкретном случае, почти похоже на ошибку, хотя все правильные события имеют место (ACTION_DOWN, за которым следуют многие события ACTION_MOVE).

Может ли кто-нибудь объяснить, почему событие onScroll не вызывается в этом конкретном случае?


person Daniel    schedule 28.05.2018    source источник


Ответы (2)


Я до сих пор не понял, почему событие onScroll не вызывается в этом случае, но я сделал обходной путь, который решает проблему в моем случае.

Я создал функцию для имитации события касания, поэтому GestureDetector сначала будет использовать имитацию события касания, а потом уже будет нормально работать.

public void simulateTouch() {
    MotionEvent event = MotionEvent.obtain(1, 2, MotionEvent.ACTION_UP, 0, 0, 0);
    onTouchEvent(event);
}

Когда я переключаюсь из режима редактирования в нормальный режим с помощью кнопки HomeAsUp, я просто вызываю эту simulateTouch() функцию, после чего кажется, что GestureDetector сбрасывается, и с этого момента он работает нормально.

person Daniel    schedule 30.05.2018

У меня было аналогичное поведение, когда я добавил onDoubleTap(MotionEvent e) переопределение к моему SimpleOnGestureListener, а затем после двойного касания прокрутка не распознавалась, пока я не сделал что-то вроде жеста бросания. Он начал вести себя нормально после того, как я изменил возвращаемое значение onDoubleTap(MotionEvent e) на false.

person Almighty    schedule 10.10.2018