В этом уроке мы познакомимся с основными событиями ввода в Android.
В системе Android предусмотрено несколько способов перехвата событий взаимодействия пользователя с вашим приложением. Например, когда пользователь касается отображаемого объекта (кнопки), вызывается метод onTouchEvent() этого объекта.
Основные методы взаимодействия с View:
onClick() из View.OnClickListener. Этот метод вызывается, когда пользователь касается элемента;onLongClick() из View.OnLongClickListener. Этот метод вызывается, когда пользователь касается элемента и удерживает его;onFocusChange() из View.OnFocusChangeListener. Этот метод вызывается, когда пользователь делает активным или не активным текущий элемент;onKey() из View.OnKeyListener. Этот метод вызывается, когда пользователь переносит фокус на элемент и нажимает или отпускает клавишу на устройстве;onTouch() из View.OnTouchListener. Этот метод вызывается, когда пользователь выполняет действие, считающееся событием касания, например, нажимает, отпускает или выполняет любой жест на экране (в пределах границ элемента).onCreateContextMenu() из View.OnCreateContextMenuListener. Этот метод вызывается, когда создается контекстное меню.Чтобы определить один из этих методов и обрабатывать события, необходимо реализовать интерфейс в вашем проекте или определите его как анонимный класс.
Обратимся к документации. Обратите внимание, что вызов onClick() не содержит возвращаемого значения, но некоторые методы должны возвращать значение. Нужно возвращать значение или нет, зависит от события. Например:
onLongClick() — этот метод возвращает значение, указывающее, что вы обработали это событие: true - вы обработали событие и его следует остановить, false - если вы не обработали его и/или событие должно продолжаться.
С простейшим onClick мы разобрались в предыдущем уроке. Давайте теперь посмотрим, что такое onTouch и с какими событиями он может работать. Для этого создадим новое View и установим ему onTouchListener:
floatingActionButton.setOnTouchListener(View.OnTouchListener { _, event ->
Log.e("!!!", event.toString())
return@OnTouchListener false
})
Запустив приложение и коснувшись экрана, мы увидим одну строку:
2021-03-09 13:17:04.916 2751-2751/ru.ok.technopolis.recyclerview.sample E/!!!: MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=49.0, y[0]=69.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=75312792, downTime=75312792, deviceId=6, source=0x1002, displayId=0 }
В логах есть упоминание только о событии ACTION_DOWN, но если обратиться к документации, событий гораздо больше. Почему другие события не попали в логи? Дело в том, что мы вернули false в методе onTouch, следовательно, мы сами сообщили о том, что завершили обработку событий. Давайте теперь попробуем вернуть значение true:
2021-03-09 13:17:59.838 4750-4750/ru.ok.technopolis.recyclerview.sample E/!!!: MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=64.0, y[0]=75.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=75367698, downTime=75367698, deviceId=6, source=0x1002, displayId=0 }
2021-03-09 13:17:59.840 4750-4750/ru.ok.technopolis.recyclerview.sample E/!!!: MotionEvent { action=ACTION_MOVE, actionButton=0, id[0]=0, x[0]=64.0, y[0]=75.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=75367721, downTime=75367698, deviceId=6, source=0x1002, displayId=0 }
2021-03-09 13:17:59.883 4750-4750/ru.ok.technopolis.recyclerview.sample E/!!!: MotionEvent { action=ACTION_MOVE, actionButton=0, id[0]=0, x[0]=64.0, y[0]=75.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=75367750, downTime=75367698, deviceId=6, source=0x1002, displayId=0 }
2021-03-09 13:17:59.895 4750-4750/ru.ok.technopolis.recyclerview.sample E/!!!: MotionEvent { action=ACTION_MOVE, actionButton=0, id[0]=0, x[0]=64.0, y[0]=75.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=75367768, downTime=75367698, deviceId=6, source=0x1002, displayId=0 }
2021-03-09 13:17:59.896 4750-4750/ru.ok.technopolis.recyclerview.sample E/!!!: MotionEvent { action=ACTION_UP, actionButton=0, id[0]=0, x[0]=64.0, y[0]=75.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=75367776, downTime=75367698, deviceId=6, source=0x1002, displayId=0 }
Теперь в нашем логе появились новые события: ACTION_MOVE и ACTION_UP.