Подтвердить что ты не робот

Перемещение/перемещение вкладки в сочетании с ScrollView?

Лучшее, что я мог найти по этой конкретной проблеме (хотя я не использую Галерею): 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;
    }
}
4b9b3361

Ответ 1

Я бы посоветовал вам взглянуть на исходный код приложения I/O 2010, поскольку реализация FlingableTabHost, по-видимому, решила эту проблему:

http://iosched.googlecode.com/svn/trunk/src/com/google/android/apps/iosched/ui/ScheduleActivity.java

Я думаю, что ключ состоит в расширении TabHost и переопределении его метода onInterceptTouchEvent.

Ответ 2

В поисках решения подобной проблемы у меня есть, я наткнулся на этот бит:

eventsInterceptionEnabled: если установлено значение true, это свойство сообщает оверлейу, чтобы украсть события у своих детей, как только он узнает, что пользователь действительно рисует жест. Это полезно при прокручиваемом представлении под наложением, чтобы избежать прокрутки базового дочернего элемента, когда пользователь рисует свой жест

Из сайта Android Dev говорится об использовании этого атрибута в корне <android.gesture.GestureOverlayView> в вашем файле макета.

Ответ 3

Для чего это стоит, я нашел метод onFling очень ненадежным. Я переопределяю метод onScroll в SimpleGestureDetector и определяю my onInterceptTouchEvent как:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    //Call super first because it does some hidden motion event handling
    boolean result = super.onInterceptTouchEvent(ev);
    if (this.mGestureScanner.onTouchEvent(ev)) return true;
    return result;
}