#android #ontouchlistener #motionevent
#Android #ontouchlistener #событие движения
Вопрос:
У меня есть следующий метод, который начинает запись звука, когда пользователь удерживает нажатой кнопку, и останавливает запись, когда пользователь поднимает палец.
@SuppressLint("ClickableViewAccessibility")
private fun setTouchListenerForCreatingAudio() {
// binding. recordAudioBtn is the button used for recording (I use data binding)
binding.recordAudioBtn.setOnTouchListener { _, event ->
when(event.action){
MotionEvent.ACTION_DOWN -> startRecord()
MotionEvent.ACTION_UP -> stopRecord()
}
false
}
}
Но я заметил некоторое странное поведение. Иногда ACTION_UP
дело не запускается после поднятия моего пальца, так что stopRecord()
это никогда не вызывается.
В некоторых потоках SO я читал, что нужно возвращать true
вместо false
, но тестирование в моем случае не помогло.
Есть предложения? Совет?
Ответ №1:
Если палец пользователя отодвинется от кнопки перед отпусканием, MotionEvent.ACTION_UP
вызов вызываться не будет. Вместо этого вы получите MotionEvent.ACTION_CANCEL
событие (см. Документацию). Это может быть причиной поведения, которое вы видите.
Вы также должны обработать этот случай, либо выполнив корректный сбой, либо выполнив ту же логику ACTION_UP. Вы также должны возвращать true в тех случаях, когда вы обрабатываете событие. Например:
return@setOnTouchListener when(event.action){
MotionEvent.ACTION_DOWN -> {
startRecord()
true
}
MotionEvent.ACTION_CANCEL,
MotionEvent.ACTION_UP -> {
stopRecord()
true
}
else -> false
}