录音需求中,往往有两种常规操作。
长按基本实现流程:
监听触摸事件,按下时录制,抬起时停止。
(相关资料图)
点击基本流程:
点击开始录制,在次点击停止录制
但是凡事有绝对,如果需要同时支持长按录制抬起结束跟点击录制在次点击结束呢?面对如此无理的需求,从技术层面上怎么如丝滑般去兼容呢。
需要两者兼容,只能从触摸事件入手了,这里的重点其实就在于怎么在触摸事件中去区分点击事件跟触摸事件。
功能可能并不难,但是没有一个好的思路,就会导致代码逻辑混乱,不好维护,并且代码过多,不够简洁。
先看效果图,前面是点击事件,后面是触摸长按。
首先把开始录制跟结束方法写好,在触摸事件里,按下时录制,抬起时结束,等于是长按录制的逻辑
在此基础上想要兼容点击逻辑,其实只要一个限制就行,那就是点击的时间。
正常情况下我点击后依次经历了按下跟抬起两个事件(触摸不做处理),那我加个点击时间,如果间隔小于800毫秒,就不做处理。
这时候我点击只会触发一次按下事件,等我下次点击时,已经超过了800毫秒,并且可以防止快速点击,一举两得(快速点击录制时长过短,需要限制,禁止无意义操作)。
在回到触摸逻辑,我点击录制,不松手,超过800毫秒,此时我在抬起,直接触发抬起事件,逻辑如丝滑般柔顺。
ivRecord.setOnTouchListener { _, event -> if (abs(System.currentTimeMillis() - downTimeInMillis) >= 800L) { when (event.action) { MotionEvent.ACTION_DOWN -> { start() } MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> { stop() } } } true }
一行 if 判断,完美兼容两种录制模式,简单明了。