События касания просачиваются вверх по иерархии, несмотря на «верни истину» - PullRequest
2 голосов
/ 04 ноября 2011

У меня есть проект, использующий ViewPager, который работает правильно: я могу перелистывать страницы от просмотра к просмотру, щелкая влево и вправо.

На одной странице ViewPager у меня есть пользовательское представление, и я пытаюсьдобавьте под ним другое представление (LinearLayout), чувствительное к прикосновению, которое не будет «пейджировать» ViewPager.Например:

<LinearLayout >

    <myView />

    <LinearLayout> // The touch sensitive region
    </LinearLayout>

</LinearLayout>

После того, как мое представление было раздуто и добавлено в ViewPager, я вызываю setOnTouchListener (), чтобы присоединить слушателя к внутреннему LinearLayout.Слушатель возвращает «true».

К сожалению, когда я перемещаюсь горизонтально в этом представлении, я перехожу на другую страницу.События, которые я получаю: ACTION_DOWN, ACTION_MOVE (n раз) и, наконец, ACTION_CANCEL.Хотя я остался в поле зрения.

Кажется, что событие поднялось по иерархии представления и обработано ViewPager.

Есть ли логическое объяснение этому поведению?

Ответы [ 2 ]

2 голосов
/ 04 декабря 2012

Нет необходимости переопределять dispatchTouchEvent ().Вместо этого в событии ACTION_DOWN используйте View.getParent().requestDisallowInterceptTouchEvent(true).

requestDisallowInterceptTouchEvent(true), чтобы запросить родительское представление (ViewPager) не перехватывать это конкретное событие касания.Этот флаг будет сброшен после завершения MotionEvent, поэтому вы должны вызвать его в ACTION_DOWN.

2 голосов
/ 06 ноября 2011

Я нашел обходной путь, перехватывая события на уровне Activity, переопределяя dispatchTouchEvent ().

Там я вызываю super.dispatchTouchEvent () для обработки всех событий, если пользователь не касается моего сенсорного представления,Я проверяю, находится ли пользователь на правильной странице и в нужном месте.В этом случае я обрабатываю событие самостоятельно.

@Override
public boolean dispatchTouchEvent (MotionEvent ev) {


    if ( pager.getCurrentPosition()!=0 ) { // Test ViewPager page
            super.dispatchTouchEvent(ev);
    }   
    else {

        int[] xy = new int[2];
        findViewById(R.id.myTouchControl).getLocationOnScreen(xy);
        int topOfView = xy[1];

        if ( ev.getY() > topOfView ) {
            // Custom processing
            ...

        } else {
            // Standard processing
            super.dispatchTouchEvent(ev);
        }
    }
    return false;
}
...