Проведите пальцем по экрану / Fling tab-change в сочетании с ScrollView?

Лучшее, что я смог найти по этой конкретной проблеме (хотя я не использую галерею): 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;
    }
}
24
задан Community 23 May 2017 в 11:53
поделиться