Понимание концепций Touch framework

Здравствуйте, коллеги-разработчики, в этой статье я собираюсь обсудить платформу Android Touch, как прикосновения проходят через приложение и как Android обрабатывает все эти события.

Как Android справляется с Touch

Каждое событие касания в вашем приложении завершается как MotionEvent. Эти MotionEvent содержат описание действия и некоторые метаданные, такие как местоположение события касания на экране. Вот некоторые из действий:

  • ACTION_DOWN: когда палец касается экрана
  • ACTION_UP: когда палец отрывается от экрана
  • ACTION_POINTER_DOWN
  • ACTION_POINTER_UP
  • ACTION_MOVE: при перемещении пальца по экрану
  • ACTION_CANCEL

Жест определяется как начинающийся с ACTION_DOWN и заканчивающийся на ACTION_UP.

  1. События начинаются с Activity с dispatchTouchEvent()
  2. События перетекают сверху вниз через просмотры
  • Родители (ViewGroups) отправляют события своим детям
  • Может перехватывать события в любое время.

3. События спускаются по иерархии, а затем возвращаются, пока не будут использованы.

При обработке отправки события верхняя позиция иерархии берет на себя инициативу, но когда дело доходит до обработки касания, дочерние представления, использующие onTouchEvent, всегда являются первыми, а затем они продолжают двигаться к ViewGroups.

Событие касания работает так же, как отправка событий, но в обратном порядке от дочернего к родительскому.

При перехвате, если мы возвращаем true, событие касания не передается своим дочерним элементам, а если мы передаем false, экосистема Android получает уведомление о том, что ViewGroup хочет отправить событие своим дочерним элементам,

Ребенок может вызвать requestDisallowTouchIntercept(), чтобы заблокировать onInterceptTouchEvent() на время текущего жеста. Например, какой-то вид с прокруткой внутри Scrollview. Мы хотим, чтобы родительский скролл останавливался при прокрутке дочернего элемента. Этот флаг сбрасывается платформой при новом жесте (ACTION_DOWN)

Сценарий 1. Когда ни одно представление не использует событие

Сценарий 2 - когда представление использует событие

Сценарий 3 -

В случае кнопки внутри ScrollView, кнопка потребляет событие касания при нажатии, но если жест изменяется на перетаскивание, вызывается onInterceptTouchEvent из ScrollView и ScrollView начинает обрабатывать касание, а кнопка получает событие ACTION_CANCEL.

  • Все зависит от onInterceptTouchEvent() и его возвращаемого значения. DispatchTouchEvent зависит от значения onInterceptTouchEvent(), если он возвращает true, отправка отменяется, а если возвращает false, отправка события касания продолжается до тех пор, пока оно не будет использовано.
  • Если onTouchEvent() возвращает true, это означает, что касание обработано, но если оно возвращает false, это означает, что касание не обрабатывается.

Для сложного сенсорного взаимодействия:

У нас есть GestureDetector, который обрабатывается через onTouchListener() or onTouchEvent():

  • onDown(), onSingleTapUp(), onDoubleTap()
  • onLongPress()
  • onScroll()
  • onFling()

TouchDelegate

Вспомогательный класс для обработки ситуаций, когда вы хотите, чтобы область касания представления была больше, чем ее фактические границы представления. Вид, область касания которого изменена, называется представлением делегата. Этот класс должен использоваться предком делегата.

Позволяет сенсорной области определенного вида отличаться от ее фактических границ касания.

Надеюсь, вы кое-что узнали! Спасибо за чтение.

Нажмите 👏 , чтобы показать свою поддержку и поделиться ею с другими пользователями Medium.

Вы можете найти меня в Twitter и Instagram