Android GestureDetector не может обнаружить событие onScroll с FrameLayout - PullRequest
4 голосов
/ 10 февраля 2012

У меня есть представление, которое расширяет FrameLayout, и мне нужно получать уведомления о событиях прокрутки на нем. это представление имеет экземпляр класса, который реализует GestureDetector, который вызывается переопределенным методом onInterceptTouchEvent.

    private class HorizontalScrollListener implements OnGestureListener {
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        ...
        return false;
    }
    @Override
    public boolean onDown(MotionEvent e) { 
         ...
         return false; 
    }
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
        return false;
    }
    @Override
    public void onLongPress(MotionEvent e) {
        ...
        System.out.println();
    }
    @Override
    public void onShowPress(MotionEvent e) {}
    @Override
    public boolean onSingleTapUp(MotionEvent e) { return false; }
}

Единственная проблема в том, что методы onDown и onLongPress могут вызываться при попытке прокрутки, но фактические методы onScroll никогда не вызываются.

    @Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    boolean result = super.onInterceptTouchEvent(event);

    if (gestureDetector.onTouchEvent(event)) {
        return result;
    } else {
        return false;
    }       
}

1 Ответ

0 голосов
/ 01 декабря 2017

onInterceptTouchEvent больше не вызывается для последовательности движения, когда возвращается true.События отправляются на onTouchEvent непосредственно после этого (поскольку они теперь перехватываются от дочерних элементов).

Здесь необходимо внести два изменения:

  • OnGestureListener.onDown() должно вернуться trueпоэтому детектор может обрабатывать более сложные жесты, такие как прокрутки
  • onInterceptTouchEvent всегда должен возвращать false, чтобы поток событий, передаваемых этому методу,
...