Детектор жестов не работает

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

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

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

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

 [view].setLongClickable(true); 

Это нужно назвать первым.

Intereting Posts
Нежелательное дополнение макета Android Как получить сверхпрокрутку в стиле iPhone в Android 2.3 (Gingerbread)? Android: Подписанный файл Apk не включает внешнюю библиотеку и бросает «java.lang.ExceptionInInitializerError» Присутствие слушателя не работает в asmack Как обмениваться данными между renderscript и андроидной картой? Пользовательский макет Android для AutoCompleteTextView Admob Interstitial ad on Button Click Добавить виджет Switch в ActionBar и ответить на событие изменения Singleton vs статический внутренний класс для класса Database Helper в Android Android «Только оригинальный поток, создавший иерархию представлений, может коснуться его представлений». Android: удалить вид из галереи Проверка подлинности Google Получение координат от «Поделиться этим местом» в Google Maps Как отменить регистрацию телефона из облачных сообщений firebase Как отменить регистрацию слушателя от датчика после остановки обслуживания?