setOnTouchListener для кнопки записи звука не работает должным образом в Android

#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
}