Ответ 1
onDown()
должен возвращать true
, даже если вы не хотите реагировать на это событие, иначе он заставит детектор отбросить любое последующее событие и, следовательно, любой жест.
У меня есть следующий 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;
}
}
onDown()
должен возвращать true
, даже если вы не хотите реагировать на это событие, иначе он заставит детектор отбросить любое последующее событие и, следовательно, любой жест.
Используете ли вы GestureDetector.OnGestureListener
или нет, лучше всего реализовать метод onDown()
, который возвращает true. Это связано с тем, что все жесты начинаются с сообщения onDown()
. Если вы вернете false из onDown()
, как это делает GestureDetector.SimpleOnGestureListener
по умолчанию, система предполагает, что вы хотите игнорировать остальную часть жеста, а другие методы GestureDetector.OnGestureListener
никогда не вызываются. Это может вызвать непредвиденные проблемы в вашем приложении. Единственный раз, когда вы должны вернуть false из onDown()
, - это если вы действительно хотите игнорировать весь жест.
http://developer.android.com/training/gestures/detector.html#detect
[view].setLongClickable(true);
Это нужно вызвать сначала.