小米手機(jī)出現(xiàn)OnTouch事件中MotionEvent.ACTION_UP不執(zhí)行

尊重原創(chuàng),本文轉(zhuǎn)自:https://blog.csdn.net/qq_23934247/article/details/88711079

今天在做一個(gè)錄音的功能,按下開始錄音,放開結(jié)束錄音。完美的實(shí)現(xiàn)了,還測(cè)試了一兩臺(tái)手機(jī),打算攻下個(gè)功能點(diǎn)去做了的。結(jié)果,好死不死,用了我自己的小米note3的手機(jī)也測(cè)了下錄音,結(jié)果????為什么明明放開了,還沒(méi)有結(jié)束錄音???還需要再次按下才能結(jié)束錄音,當(dāng)時(shí)那個(gè)心吶,痛的我。還特意去測(cè)試那找了小米5的手機(jī)來(lái)測(cè),但是人家還是好好的,正常按下放開。一點(diǎn)毛病都沒(méi),那會(huì)心就更痛了。怎么只有我的手機(jī)才出現(xiàn)這個(gè)問(wèn)題,開始以為是傳送門的問(wèn)題,把傳送門關(guān)了后還是一樣,結(jié)果就找啊找啊,眼淚都掉下來(lái)了,終于找到了!。

原來(lái),MotionEvent.ACTION_UP沒(méi)有執(zhí)行啊,執(zhí)行的是MotionEvent.ACTION_CANCEL事件?。?!

原因是:

當(dāng)控件收到前驅(qū)事件(什么叫前驅(qū)事件?一個(gè)從DOWN一直到UP的所有事件組合稱為完整的手勢(shì),中間的任意一次事件對(duì)于下一個(gè)事件而言就是它的前驅(qū)事件)之后,后面的事件如果被父控件攔截,那么當(dāng)前控件就會(huì)收到一個(gè)CANCEL事件,并且把這個(gè)事件會(huì)傳遞給它的子事件。(注意:這里如果在控件的onInterceptTouchEvent中攔截掉CANCEL事件是無(wú)效的,它仍然會(huì)把這個(gè)事件傳給它的子控件)之后這個(gè)手勢(shì)所有的事件將全部攔截,也就是說(shuō)這個(gè)事件對(duì)于當(dāng)前控件和它的子控件而言已經(jīng)結(jié)束了。

簡(jiǎn)單來(lái)說(shuō)就是他不是一個(gè)完整的手勢(shì)響應(yīng) 例如 子控件只是響應(yīng)了down 而父控件把子控件的up事件攔截了 這個(gè)時(shí)候就會(huì)觸發(fā)cancel事件 來(lái)區(qū)分up事件(兒子自己收到微信媽媽要給他一個(gè)蘋果down,老爹給攔截了。

知道原因那就好辦了,加上MotionEvent.ACTION_CANCEL事件,把MotionEvent.ACTION_UP里的內(nèi)容copy進(jìn)去,完美。

最后來(lái)說(shuō)一下onTouch的常用事件:

1、ACTION_DOWN:表示按下了屏幕,第一個(gè)執(zhí)行也是必然執(zhí)行的方法。

2、ACTION_MOVE:表示為移動(dòng)手勢(shì),會(huì)不斷的執(zhí)行直到觸摸停止。

3、ACTION_UP :表示為離開屏幕,觸摸停止的時(shí)候執(zhí)行。

4、ACTION_CANCEL:事件被上層攔截 時(shí)觸發(fā)。

參考:

http://www.gcssloop.com/customview/motionevent

https://blog.csdn.net/cqx13763055264/article/details/86543140

https://blog.csdn.net/lovelyprogrammer/article/details/79608132

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容