Android Touch事件分發機制學習

來源:互聯網
上載者:User

標籤:

Android  事件分發機制

 

ViewGroupdispatchTouchEvent 返回true
dispatchTouchEvent: Activity    ACTION_DOWN    MyrelativeLayout  dispatchTouchEvent:   ACTION_DOWN    dispatchTouchEvent: Activity    ACTION_UP    MyrelativeLayout  dispatchTouchEvent:   ACTION_UP

ViewGroup自己在dispatchTouchEvent中消費這個事件

dispatchTouchEvent 返回false
  dispatchTouchEvent: Activity    ACTION_DOWN        MyrelativeLayout  dispatchTouchEvent:   ACTION_DOWN        onTouchEvent: Activity    ACTION_DOWN        dispatchTouchEvent: Activity    ACTION_UP        onTouchEvent: Activity    ACTION_UP

回傳到Activity中onTouchEvent消費事件

 

dispatchTouchEvent 返回 super.dispatchTouchEvent(ev)子View也都返回super
            dispatchTouchEvent: Activity    ACTION_DOWN        MyrelativeLayout  dispatchTouchEvent:   ACTION_DOW         MyrelativeLayout onInterceptTouchEvent  ACTION_DO         MyImageView dispatchTouchEvent:   ACTION_DOWN          MyImageView     onTouchEvent:   ACTION_DOWN        MyrelativeLayout: onTouchEvent  ACTION_DOWN        onTouchEvent: Activity    ACTION_DOWN        dispatchTouchEvent: Activity    ACTION_UP        onTouchEvent: Activity    ACTION_UP        

 ViewGroup返回dispatchTouchEvent,會調用ViewGroup中的onInterceptTouchEvent方法,
如果onInterceptTouchEvent返回super.onInterceptTouchEvent(ev)
就迴向下傳到子View
子View中調用dispatchTouchEvent與onTouchEvent方法
如果都返回的是super().再向上傳到ViewGroup,
這時調用ViewGroup的onTouchEvent,如果返回為super,
剛再向上返回給Activity,調用Activity的onTouchEvent消費

 

ViewGroup中的onInterceptTouchEvent返回true,onTouchEvent返回super
    dispatchTouchEvent: Activity    ACTION_DOWN        MyrelativeLayout  dispatchTouchEvent:   ACTION_DOWN         MyrelativeLayout onInterceptTouchEvent  ACTION_DOWN        MyrelativeLayout: onTouchEvent  ACTION_DOWN        onTouchEvent: Activity    ACTION_DOWN        dispatchTouchEvent: Activity    ACTION_UP        onTouchEvent: Activity    ACTION_UP

 事件從Activty的dispatchTouchEvent開始
調用ViewGroup的dispatchTouchEvent,此時這裡返回super
會調用ViewGroup中的onInterceptTouchEvent攔截事件
onInterceptTouchEvent這裡返回true,說明攔截
就會交給ViewGroup的onTouchEvent
onTouchEvent這裡返回Suepr,不消費,就再向上傳給Activity
最後由Activty中的onTouchEvent來消費

 

ViewGroup中的onInterceptTouchEvent返回true,onTouchEvent返回true(和上面相同最後由ViewGroup來消費)
            dispatchTouchEvent: Activity    ACTION_DOWN        MyrelativeLayout  dispatchTouchEvent:   ACTION_DO         MyrelativeLayout onInterceptTouchEvent  ACTION_D        MyrelativeLayout: onTouchEvent  ACTION_DOWN        dispatchTouchEvent: Activity    ACTION_UP        MyrelativeLayout  dispatchTouchEvent:   ACTION_UP        MyrelativeLayout: onTouchEvent  ACTION_UP

 事件從Activty的dispatchTouchEvent開始
調用ViewGroup的dispatchTouchEvent,此時這裡返回super
會調用ViewGroup中的onInterceptTouchEvent攔截事件
onInterceptTouchEvent這裡返回true,說明攔截
就會交給ViewGroup的onTouchEvent
這裡onTouchEvent 返回 true表明,消費,事件到此結束不再傳遞

 

ViewGroup中的onInterceptTouchEvent返回true,onTouchEvent返回false(最後由Activty來消費)
dispatchTouchEvent: Activity    ACTION_DOWN        MyrelativeLayout  dispatchTouchEvent:   ACTION_DOWN         MyrelativeLayout onInterceptTouchEvent  ACTION_DOWN        MyrelativeLayout: onTouchEvent  ACTION_DOWN        onTouchEvent: Activity    ACTION_DOWN        dispatchTouchEvent: Activity    ACTION_UP        onTouchEvent: Activity    ACTION_UP

 

 事件從Activty的dispatchTouchEvent開始
調用ViewGroup的dispatchTouchEvent,此時這裡返回super
會調用ViewGroup中的onInterceptTouchEvent攔截事件
onInterceptTouchEvent這裡返回true,說明攔截
就會交給ViewGroup的onTouchEvent
這裡onTouchEvent 返回 false表明,不消費,
事件會向上傳遞給Activity來調用onTouchEvent來消費

 

ViewGroup中的onInterceptTouchEvent返回super
        dispatchTouchEvent: Activity    ACTION_DOWN        MyrelativeLayout  dispatchTouchEvent:   ACTION_DOWN         MyrelativeLayout onInterceptTouchEvent  ACTION_DOWN         MyImageView dispatchTouchEvent:   ACTION_DOWN          MyImageView     onTouchEvent:   ACTION_DOWN        MyrelativeLayout: onTouchEvent  ACTION_DOWN        onTouchEvent: Activity    ACTION_DOWN        dispatchTouchEvent: Activity    ACTION_UP        onTouchEvent: Activity    ACTION_UP

 

 從上到下
Activity dispatchTouchEvent

ViewGroup  dispatchTouchEvent

ViewGroup  onInterceptTouchEvent

子View的 dispatchTouchEvent

子View的 onTouchEvent

ViewGroud的 onTouchEvent
Acitivty 的 onTouchEvent

 

View子View的dispatchTouchEvent返回false

 

        dispatchTouchEvent: Activity    ACTION_DOWN        MyrelativeLayout  dispatchTouchEvent:   ACTION_DOWN         MyrelativeLayout onInterceptTouchEvent  ACTION_DOWN         MyImageView dispatchTouchEvent:   ACTION_DOWN        MyrelativeLayout: onTouchEvent  ACTION_DOWN        onTouchEvent: Activity    ACTION_DOWN        dispatchTouchEvent: Activity    ACTION_UP        onTouchEvent: Activity    ACTION_UP

 前提ViewGroup的3個方法都返回super

從上到下
Activity dispatchTouchEvent

ViewGroup  dispatchTouchEvent

ViewGroup  onInterceptTouchEvent

子View dispatchTouchEvent(返回false直接回返到ViewGroup的onTouchEvent方法)
ViewGroup  onTouchEvent

Activity onTouchEvent

子View的dispatchTouchEvent返回true
dispatchTouchEvent: Activity    ACTION_DOWN        MyrelativeLayout  dispatchTouchEvent:   ACTION_DOWN         MyrelativeLayout onInterceptTouchEvent  ACTION_DOWN         MyImageView dispatchTouchEvent:   ACTION_DOWN        dispatchTouchEvent: Activity    ACTION_UP        MyrelativeLayout  dispatchTouchEvent:   ACTION_UP         MyrelativeLayout onInterceptTouchEvent  ACTION_UP         MyImageView dispatchTouchEvent:   ACTION_UP

 從上到下
Activity dispatchTouchEvent

ViewGroup  dispatchTouchEvent

ViewGroup  onInterceptTouchEvent

子View dispatchTouchEvent(返回true直接消費此事件)

 

子View的 onTouchEvent 返回true
前提子類的dispatchTouchEvent返回super        dispatchTouchEvent: Activity    ACTION_DOWN        MyrelativeLayout  dispatchTouchEvent:   ACTION_DOWN         MyrelativeLayout onInterceptTouchEvent  ACTION_DOWN         MyImageView dispatchTouchEvent:   ACTION_DOWN          MyImageView     onTouchEvent:   ACTION_DOWN        dispatchTouchEvent: Activity    ACTION_UP        MyrelativeLayout  dispatchTouchEvent:   ACTION_UP         MyrelativeLayout onInterceptTouchEvent  ACTION_UP         MyImageView dispatchTouchEvent:   ACTION_UP          MyImageView     onTouchEvent:   ACTION_UP

 

 從上到下
Activity dispatchTouchEvent

ViewGroup  dispatchTouchEvent

ViewGroup  onInterceptTouchEvent

子View dispatchTouchEvent(super)

子View的onTouchEvent返回true消費這個事件,不再向上傳遞

子View的 onTouchEvent 返回false
前提子類的dispatchTouchEvent返回super        dispatchTouchEvent: Activity    ACTION_DOWN        MyrelativeLayout  dispatchTouchEvent:   ACTION_DOWN         MyrelativeLayout onInterceptTouchEvent  ACTION_DOWN         MyImageView dispatchTouchEvent:   ACTION_DOWN          MyImageView     onTouchEvent:   ACTION_DOWN        MyrelativeLayout: onTouchEvent  ACTION_DOWN        onTouchEvent: Activity    ACTION_DOWN        dispatchTouchEvent: Activity    ACTION_UP        onTouchEvent: Activity    ACTION_UP

 

 從上到下
Activity dispatchTouchEvent

ViewGroup  dispatchTouchEvent

ViewGroup  onInterceptTouchEvent

子View dispatchTouchEvent(super)

子View的onTouchEvent返回false

ViewGroud的onTouchEvent

Acitivty的onTouchEvent

 

 

事件分發:dispatchTouchEvent

 

 如果 return true,事件會分發給當前 View 並由 dispatchTouchEvent 方法進行消費,同時事件會停止向下傳遞;
如果 return false,事件分發分為兩種情況:


如果當前 View 擷取的事件直接來自 Activity,則會將事件返回給 Activity 的 onTouchEvent 進行消費;
如果當前 View 擷取的事件來自外層父控制項,則會將事件返回給父 View 的  onTouchEvent 進行消費。
如果返回系統預設的 super.dispatchTouchEvent(ev),事件會自動的分發給當前 View 的 onInterceptTouchEvent 方法。

 

事件攔截:public boolean onInterceptTouchEvent(MotionEvent ev)

 

 在外層 View 的 dispatchTouchEvent(MotionEvent ev) 方法返回系統預設的 super.dispatchTouchEvent(ev) 情況下,事件會自動的分發給當前 View 的 onInterceptTouchEvent 方法。onInterceptTouchEvent 的事件攔截邏輯如下:


如果 onInterceptTouchEvent 返回 true,則表示將事件進行攔截,並將攔截到的事件交由當前 View 的 onTouchEvent 進行處理;
如果 onInterceptTouchEvent 返回 false,則表示將事件允許存取,當前 View 上的事件會被傳遞到子 View 上,再由子 View 的 dispatchTouchEvent 來開始這個事件的分發;
如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件預設會被攔截,

如果有子View將事件傳給子View由子View的dispatchTouchEvent來處理
如果沒有子View並將攔截到的事件交由當前 View 的 onTouchEvent 進行處理。

事件響應:public boolean onTouchEvent(MotionEvent ev)

 在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 並且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 的情況下 onTouchEvent 會被調用。onTouchEvent 的事件響應邏輯如下:

如果事件傳遞到當前 View 的 onTouchEvent 方法,而該方法返回了 false,那麼這個事件會從當前 View 向上傳遞,並且都是由上層 View 的 onTouchEvent 來接收,如果傳遞到上面的 onTouchEvent 也返回 false,這個事件就會“消失”,而且接收不到下一次事件。
如果返回了 true 則會接收並消費該事件。
如果返回 super.onTouchEvent(ev) 預設處理事件的邏輯和返回 false 時相同

 

源碼

https://github.com/ln0491/AndroidTouchDemo

 

Android Touch事件分發機制學習

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.