Детектор жестов не работает - PullRequest
10 голосов
/ 28 марта 2011

У меня есть следующий 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));

Но при запуске события не запускаются, я отлаживаю его, Я вижу, onDown вызывается, но 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;
        }
    }

Ответы [ 3 ]

39 голосов
/ 28 марта 2011

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

4 голосов
/ 26 мая 2013

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

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

1 голос
/ 22 мая 2015
[view].setLongClickable(true);

Это должно быть вызвано первым.

...