Лучшее, что я смог найти по этой конкретной проблеме (хотя я не использую галерею): ScrollView и Gallery вмешиваются - на самом деле не дает конкретного ответа хотя. И моя реализация, очевидно, не использует галерею.
Переходите к следующей жирной части для интересной части
Итак, я получил Fling / Swipe / Flick / как хотите, чтобы это работало некоторое время назад в моем приложении. Вдохновение было собрано в нескольких разных местах, некоторые из них - это «базовое обнаружение жестов» здесь, на Stack Overflow ( Обнаружение жестов перелистывания в макете сетки ), Code Shogun ( http: // www. codehogun.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, очевидно, реагируют на прокрутку вверх / вниз, чтобы вы могли просматривать все данные внутри них, что неудивительно. Проблема в том, что функция "прокрутки" этих ScrollViews может перезаписывать мой жест бросания. Я не могу бросить внутрь 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 для 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;
}
}