Детектор жестов не работает

У меня есть следующий GestureListener:

public class BookListener extends SimpleOnGestureListener implements
        OnTouchListener {
    private LibraryActivity main;
private Book book;
private GestureDetector gesture;

public BookListener(Book book, LibraryActivity main) {
    this.main = main;
    this.book = book;
    gesture = new GestureDetector(main,this);
}

public boolean onDoubleTap(MotionEvent e) {
    main.showInfo(book);
    return true;
}

public boolean onSingleTapConfirmed(MotionEvent e) {
    main.openBook(book.getUrl());
    return true;
}

public boolean onDown(MotionEvent evt){
    return false;
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    return gesture.onTouchEvent(event);
    }
}

Я добавляю его в свой вид следующим образом:

view.setOnTouchListener(new BookListener(book, main));

Но при запуске события не запускаются, я отлаживаю его, я вижу, что он вызывается, но onSingleTapConfirmed или onDoubleTap nevers работает.

Что не так?

У меня этот код работает отлично:

    private class GestureListener extends SimpleOnGestureListener {
        private boolean newEvent = true;
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            document.rescale();
            refreshImage();
            return true;
        }

        public boolean onDown(MotionEvent evt){
            newEvent = true;
            return false;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                float distanceX, float distanceY) {
            if (!document.isScaled() && newEvent) {
                Vector2D v = new Vector2D(e2).minus(new Vector2D(e1));
                if (v.getX() > 60 || v.getX() < -60){
                    if (v.getX() < 0)
                        next();
                    else
                        previous();
                    newEvent = false;
                }
            } else {
                img.notifyScroll(-distanceX, -distanceY);
                img.invalidate();
            }
            return true;
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            switchSideBar();
            return true;
        }
    }

Ответ 1

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

Ответ 2

Используете ли вы GestureDetector.OnGestureListener или нет, лучше всего реализовать метод onDown(), который возвращает true. Это связано с тем, что все жесты начинаются с сообщения onDown(). Если вы вернете false из onDown(), как это делает GestureDetector.SimpleOnGestureListener по умолчанию, система предполагает, что вы хотите игнорировать остальную часть жеста, а другие методы GestureDetector.OnGestureListener никогда не вызываются. Это может вызвать непредвиденные проблемы в вашем приложении. Единственный раз, когда вы должны вернуть false из onDown(), - это если вы действительно хотите игнорировать весь жест.

http://developer.android.com/training/gestures/detector.html#detect

Ответ 3

[view].setLongClickable(true);

Это нужно вызвать сначала.