我有以下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;
}
}
答案 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);
必须首先调用它。