手势检测器不工作

13

我有以下的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从来没有被触发。

出了什么问题?

我已经有一个完美运行的代码:

    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
谢谢马可斯,您编辑的答案帮助我解决了很多问题。 - praveenb
3个回答

43

onDown()必须返回true,即使你不想对那个事件做出反应,否则它会使检测器丢弃任何随后的事件,从而丢失任何手势。


嗯...我做了那个并且它有效,现在我有点困惑了,我有另一个类返回false onDown并且它也有效。 - Marcos Vasconcelos
@Marcos 嗯...这也让我感到困惑...这种不一致性可能会成为一个好问题,我猜。 - bigstones

5
无论您是否使用GestureDetector.OnGestureListener,最佳实践是实现一个onDown()方法并返回true。这是因为所有手势都始于onDown()消息。如果您从onDown()返回false,就像GestureDetector.SimpleOnGestureListener默认情况下所做的那样,系统会认为您希望忽略手势的其余部分,并且GestureDetector.OnGestureListener的其他方法将永远不会被调用。这可能会在您的应用程序中引起意外问题。您唯一应该从onDown()返回false的时候是如果您真的想要忽略整个手势。

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


3
[view].setLongClickable(true);

首先必须调用此函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接