Обычно это делается с помощью метода onInterceptTouchEvent
родительского представления. onInterceptTouchEvent
имеет шанс увидеть любое сенсорное событие, прежде чем его увидят дети. Если onInterceptTouchEvent
возвращает true
, то дочернее представление, которое ранее обрабатывало события касания, получает ACTION_CANCEL
, и события с этого момента отправляются методу onTouchEvent
родителя для обычной обработки. Он также может возвращать false
и просто следить за событиями, когда они перемещаются по иерархии представления к своим обычным целям.
По сути, вы хотите сделать это в onInterceptTouchEvent
в родительском представлении, где вы обнаруживаете броски:
- На
ACTION_DOWN
запишите местоположение касания. Возврат false
.
- На
ACTION_MOVE
проверьте дельту между начальной позицией касания и текущей позицией. Если оно превышает пороговое значение (платформа использует ViewConfiguration#getScaledTouchSlop()
или другие соответствующие значения из ViewConfiguration
для подобных вещей), верните true
.
- Обнаружение и обработка броска как обычно на основе
onTouchEvent
.
После перехвата ListView
отменит обработку касания, и вы не получите нежелательных событий касания в элементах списка. ListView
также настроен так, чтобы запретить его родительскому элементу перехватывать события, когда пользователь начал вертикальную прокрутку списка, что означает, что вы не получите ошибочные горизонтальные колебания, если пользователь небрежно отклоняет список по вертикали.
Вот как такие вещи, как стандартный Android Launcher или News and Weather, выполняют параллельное перелистывание прокручиваемого / вставляемого контента.