錄音需求中,往往有兩種常規(guī)操作。
長(zhǎng)按基本實(shí)現(xiàn)流程:
監(jiān)聽(tīng)觸摸事件,按下時(shí)錄制,抬起時(shí)停止。
(相關(guān)資料圖)
點(diǎn)擊基本流程:
點(diǎn)擊開(kāi)始錄制,在次點(diǎn)擊停止錄制
但是凡事有絕對(duì),如果需要同時(shí)支持長(zhǎng)按錄制抬起結(jié)束跟點(diǎn)擊錄制在次點(diǎn)擊結(jié)束呢?面對(duì)如此無(wú)理的需求,從技術(shù)層面上怎么如絲滑般去兼容呢。
需要兩者兼容,只能從觸摸事件入手了,這里的重點(diǎn)其實(shí)就在于怎么在觸摸事件中去區(qū)分點(diǎn)擊事件跟觸摸事件。
功能可能并不難,但是沒(méi)有一個(gè)好的思路,就會(huì)導(dǎo)致代碼邏輯混亂,不好維護(hù),并且代碼過(guò)多,不夠簡(jiǎn)潔。
先看效果圖,前面是點(diǎn)擊事件,后面是觸摸長(zhǎng)按。
首先把開(kāi)始錄制跟結(jié)束方法寫(xiě)好,在觸摸事件里,按下時(shí)錄制,抬起時(shí)結(jié)束,等于是長(zhǎng)按錄制的邏輯
在此基礎(chǔ)上想要兼容點(diǎn)擊邏輯,其實(shí)只要一個(gè)限制就行,那就是點(diǎn)擊的時(shí)間。
正常情況下我點(diǎn)擊后依次經(jīng)歷了按下跟抬起兩個(gè)事件(觸摸不做處理),那我加個(gè)點(diǎn)擊時(shí)間,如果間隔小于800毫秒,就不做處理。
這時(shí)候我點(diǎn)擊只會(huì)觸發(fā)一次按下事件,等我下次點(diǎn)擊時(shí),已經(jīng)超過(guò)了800毫秒,并且可以防止快速點(diǎn)擊,一舉兩得(快速點(diǎn)擊錄制時(shí)長(zhǎng)過(guò)短,需要限制,禁止無(wú)意義操作)。
在回到觸摸邏輯,我點(diǎn)擊錄制,不松手,超過(guò)800毫秒,此時(shí)我在抬起,直接觸發(fā)抬起事件,邏輯如絲滑般柔順。
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 判斷,完美兼容兩種錄制模式,簡(jiǎn)單明了。
關(guān)鍵詞: