用于录制音频按钮的setOnTouchListener在Android中无法正常工作

问题描述

我有以下方法,当用户按住单击按钮时开始记录音频,而当用户抬起手指时停止记录。

@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,但是对我的情况进行测试没有帮助。

有什么建议吗?忠告?

解决方法

如果在释放之前用户的手指离开了按钮,则不会调用MotionEvent.ACTION_UP。相反,您将收到MotionEvent.ACTION_CANCEL事件(请参阅documentation)。这可能是您所看到的行为的原因。

您也应该通过适当地失败或执行相同的ACTION_UP逻辑来处理这种情况。在处理事件的情况下,您还应该返回true。例如:

return@setOnTouchListener when(event.action){
    MotionEvent.ACTION_DOWN -> {
        startRecord()
        true
    }
    MotionEvent.ACTION_CANCEL,MotionEvent.ACTION_UP -> {
        stopRecord()
        true
    } 
    else -> false
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...