手势探测器不工作

时间:2011-03-28 18:15:59

标签: android listener gesture

我有以下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 个答案:

答案 0 :(得分:39)

onDown()必须返回true,即使您不想对那个事件作出反应,否则它会让检测器丢弃任何后续事件,因此任何手势

答案 1 :(得分:4)

您是否使用GestureDetector.OnGestureListener,这是实现返回true的onDown()方法的最佳做法。这是因为所有手势都以onDown()消息开头。如果您从onDown()返回false,正如GestureDetector.SimpleOnGestureListener默认情况下那样,系统会假定您要忽略其余的手势,而GestureDetector.OnGestureListener的其他方法永远不会被调用。这可能会在您的应用中导致意外问题。唯一一次你应该从onDown()返回false是你真的想忽略整个手势。

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

答案 2 :(得分:1)

[view].setLongClickable(true);

必须首先调用它。