Android中的Touch事件处理流程
生活随笔
收集整理的這篇文章主要介紹了
Android中的Touch事件处理流程
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、當(dāng)觸摸屏幕時,最先執(zhí)行的是Activity中的 ? ???public?boolean?dispatchTouchEvent?(MotionEvent ev) { ????????if?(ev.getAction() == MotionEvent.?ACTION_DOWN) { ??????????? onUserInteraction(); ??????? } ????????if?(getWindow().superDispatchTouchEvent(ev)) { ????????????return?true; ??????? } ????????return?onTouchEvent(ev); ??? } 如果某些事件無法監(jiān)測到,可以重寫此方法,優(yōu)先處理ev,然后再調(diào)用super.dispatchTouchEvent。
2、Activity中的onTouchEvent的調(diào)用時機(jī)如下:當(dāng)Activity下的所有view的onTouchEvent都返回false時(都不處理touch事件,默認(rèn)返回false),才會調(diào)用Activity中的onTouchEvent。
因此,該事件主要用于點(diǎn)擊視圖的外圍,無view的空白處。
另外,從view里的onTouchEvent代碼可以看出,如果view設(shè)置了clickable = true,則會返回true,消耗此次Touch事件。 ? ? ? ???if?(((viewFlags &?CLICKABLE) ==?CLICKABLE?|| ??????????????? (viewFlags &?LONG_CLICKABLE?) ==?LONG_CLICKABLE)) { ????????????switch?(event.getAction()) { ? ? ?? ? ?? ? ?。。。。 ? ? ?? ? ?? } ? ? ?? ? ???return?true; ??????? } 3、 第一種情況:父viewgroup的onInterceptTouchEvent中,返回默認(rèn)值,同時子view中也返回默認(rèn)值:
可以看到,由activity進(jìn)行dispatchTouchEvent,但是并不調(diào)用activity中的Touchevetnt,而是傳遞到最外層viewgroup中,調(diào)用onInterceptTouchEvent,其返回false,因此繼續(xù)向下傳遞,一直到view。然后view調(diào)用onTouchEvent,并返回默認(rèn)值false。 onTouchEvent再從內(nèi)向外調(diào)用,直到最外層的viewgroup。最后調(diào)用activity的onTouchEvent。 注:當(dāng)手指抬起時,dispatchTouchEvent不再像下傳遞,因此viewgroup和子view都不再相應(yīng),此時activity的onTouchEvent相應(yīng)ActionUp事件。(問題的根源在于view返回false,表示不再接受下一個事件)
第二種情況:父viewgroup的onInterceptTouchEvent中,返回默認(rèn)值,同時子view中返回true:
可以看到,當(dāng)ActionDown傳遞到子view中時,子view返回true。表示消費(fèi)了此事件,因此ontouchEvent不再傳遞到父viewgroup以及activity。當(dāng)ActionUp傳遞時亦然。因此從子view的角度看,無需對父view進(jìn)行任何設(shè)置,相當(dāng)于子view直接與手指對話。
第三種情況:父viewgroup的onInterceptTouchEvent中,返回true,同時子view中返回true:
可以看到,如果父viewgroup在onInterceptTouchEvent中返回true,其子viewgrou的onInterceptTouchEvent不會被調(diào)用,子view的onTouchEvent也不會被調(diào)用。從而對其子視圖進(jìn)行了攔截。從子視圖角度看其onTouchEvent方法不會被調(diào)用,而Activity的onTouchEvent則可以被調(diào)用。 注:Activity的onTouchEvent的優(yōu)先級是最低的。
最后,反過來看第1條,當(dāng)子view消耗touch事件時,會直接使getWindow().superDispatchTouchEvent(ev)返回true,因此不再調(diào)用activity的onTouchEvent。 ? ? ? ??if?(getWindow().superDispatchTouchEvent(ev)) { ????????????return?true; ??????? }
2、Activity中的onTouchEvent的調(diào)用時機(jī)如下:當(dāng)Activity下的所有view的onTouchEvent都返回false時(都不處理touch事件,默認(rèn)返回false),才會調(diào)用Activity中的onTouchEvent。
因此,該事件主要用于點(diǎn)擊視圖的外圍,無view的空白處。
另外,從view里的onTouchEvent代碼可以看出,如果view設(shè)置了clickable = true,則會返回true,消耗此次Touch事件。 ? ? ? ???if?(((viewFlags &?CLICKABLE) ==?CLICKABLE?|| ??????????????? (viewFlags &?LONG_CLICKABLE?) ==?LONG_CLICKABLE)) { ????????????switch?(event.getAction()) { ? ? ?? ? ?? ? ?。。。。 ? ? ?? ? ?? } ? ? ?? ? ???return?true; ??????? } 3、 第一種情況:父viewgroup的onInterceptTouchEvent中,返回默認(rèn)值,同時子view中也返回默認(rèn)值:
可以看到,由activity進(jìn)行dispatchTouchEvent,但是并不調(diào)用activity中的Touchevetnt,而是傳遞到最外層viewgroup中,調(diào)用onInterceptTouchEvent,其返回false,因此繼續(xù)向下傳遞,一直到view。然后view調(diào)用onTouchEvent,并返回默認(rèn)值false。 onTouchEvent再從內(nèi)向外調(diào)用,直到最外層的viewgroup。最后調(diào)用activity的onTouchEvent。 注:當(dāng)手指抬起時,dispatchTouchEvent不再像下傳遞,因此viewgroup和子view都不再相應(yīng),此時activity的onTouchEvent相應(yīng)ActionUp事件。(問題的根源在于view返回false,表示不再接受下一個事件)
第二種情況:父viewgroup的onInterceptTouchEvent中,返回默認(rèn)值,同時子view中返回true:
可以看到,當(dāng)ActionDown傳遞到子view中時,子view返回true。表示消費(fèi)了此事件,因此ontouchEvent不再傳遞到父viewgroup以及activity。當(dāng)ActionUp傳遞時亦然。因此從子view的角度看,無需對父view進(jìn)行任何設(shè)置,相當(dāng)于子view直接與手指對話。
第三種情況:父viewgroup的onInterceptTouchEvent中,返回true,同時子view中返回true:
可以看到,如果父viewgroup在onInterceptTouchEvent中返回true,其子viewgrou的onInterceptTouchEvent不會被調(diào)用,子view的onTouchEvent也不會被調(diào)用。從而對其子視圖進(jìn)行了攔截。從子視圖角度看其onTouchEvent方法不會被調(diào)用,而Activity的onTouchEvent則可以被調(diào)用。 注:Activity的onTouchEvent的優(yōu)先級是最低的。
最后,反過來看第1條,當(dāng)子view消耗touch事件時,會直接使getWindow().superDispatchTouchEvent(ev)返回true,因此不再調(diào)用activity的onTouchEvent。 ? ? ? ??if?(getWindow().superDispatchTouchEvent(ev)) { ????????????return?true; ??????? }
轉(zhuǎn)載于:https://www.cnblogs.com/tanqiantot/archive/2013/06/05/3126810.html
總結(jié)
以上是生活随笔為你收集整理的Android中的Touch事件处理流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米全面屏电视E
- 下一篇: Android版本演进中的兼容性问题