问题描述
我有以下方法,当用户按住单击按钮时开始记录音频,而当用户抬起手指时停止记录。
@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
}