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