Лучшее, что я мог найти по этой конкретной проблеме (хотя я не использую Галерею): ScrollView и вмешивание галереи - на самом деле не дает конкретного ответа, И моя реализация, очевидно, не использует Галерея.
Перейти к следующей полужирной части для интересной части
Итак, я получил Fling/Swipe/Flick/все, что вы хотите назвать, чтобы работать некоторое время назад в моем приложении. Вдохновение было собрано из нескольких разных мест, некоторые из которых были "основным обнаружением жестов" здесь, в разделе "Переполнение стека" ( "Обнаружение жестов Fling в сетке" ), Code Shogun ( http://www.codeshogun.com/blog/2009/04/16/how-to-implement-swipe-action-in-android/) и разработка Android ( http://developingandroid.blogspot.com/2009/09/implementing-swipe-gesture.html), но я не использую ViewFlipper в своем приложении. Когда происходит переход, я просто меняю вкладку (обертывая ее на концах).
Теперь некоторые мои вкладки содержат ScrollViews. Эти ScrollViews, очевидно, реагируют на свитки вверх/вниз, чтобы вы могли просматривать все данные внутри него, и не удивительно. Проблема в том, что, казалось бы, функция "scroll" этих ScrollViews перезаписывает мой жестом fling. Я не могу попасть в ScrollView (прокрутка просто отлично), но она безупречно работает вне их (на той же вкладке, на других представлениях, таких как TableRow или что-то еще).
Я быстро просмотрел http://blog.velir.com/index.php/2010/11/17/android-snapping-horizontal-scroll/, который предоставляет способ реализации HorizontalScrollView. Но он по-прежнему обрабатывает жесты через класс, который расширяет SimpleOnGestureListener (и перезаписывает onFling), что является той же самой реализацией, что и у меня (что заставляет меня думать, что это действительно не поможет). Исходный код ScrollView от Google: http://google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/widget/ScrollView.java&d=3
Есть ли способ, чтобы моя реализация Swipe и ScrollView работала вместе без усилий?
Вот где проблема лежит, я думаю. ScrollView.java также использует метод onTouchEvent и документацию для состояний onTouchEvent for Activity:
"Вызывается, когда событие с сенсорным экраном было не обрабатывается ни одним из Это. Это наиболее полезно для обработки события, которые происходят вне ваши окна ограничены, где нет чтобы получить его".
Итак, ScrollView "переопределяет" его - что мне делать? Нет ли способа гарантировать, что обе проверены? Мой onTouchEvent, который не попадает, когда onTouchEvent обрабатывается ScrollView:
@Override
/** Used for swipe gestures */
public boolean onTouchEvent(MotionEvent event) {
if (gestureDetector.onTouchEvent(event))
return true;
else
return false;
}
Более общий исходный код ниже, вероятно, не очень важен. GestureDetector внутри моего класса Tabs со своим ассоциированным слушателем:
// Gestures
gestureDetector = new GestureDetector(new MyGestureDetector());
gestureListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
return false;
}
};
Мой класс жестов, который является вложенным классом моего класса Tabs (который расширяет TabActivity) - он такой же, как любой другой код, который вы найдете по этому вопросу:
/** GestureDetector used to swipe between classes */
class MyGestureDetector extends SimpleOnGestureListener {
TabHost tabHost = getTabHost();
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false;
if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
// my tab code
return true;
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
// my tab code
return true;
}
} catch (Exception e) {
Log.e("MyGestureDetector onFling", e.toString());
}
return false;
}
}