Touch事件傳遞順序。

首先全部的View和Activity都有spa

dispatchTouchEvent//用來分發Touch
onTouchEvent//用來響應Touch

而ViewGroup則還有一個code

onInterceptTouchEvent//用來攔截Touch

當按下界面時首先是由Activity的 dispatchTouchEvent被調用。而後是根View的dispatchTouchEvent,不斷向子View傳遞,而後由最最後的子View首先響應onTouchEvent,接着父View的onTouchEvent不斷被調用。事件

可是若是當前的View是ViewGroup時,則在dispatchTouchEvent被調用後onInterceptTouchEvent會被調用。it

以上的狀況都未返回默認的super.xxxTouchEvent的狀況。List

Activity:若是Activity的dispatchTouchEvent沒調用super.dispatchTouchEvent那麼Touch事件在此就終結了,後面將不會有任何和Touch有關的方法被調用。方法

因此說若是重寫Activity的dispatchTouchEvent那麼必定要調用super.dispatchTouchEvent,除非你不打算讓Touch事件向下傳遞。Activity的dispatchTouchEvent方法的返回值並不會影響Touch事件後續調用。因此返回true,false好像無所謂。總結

ViewGroup:若是ViewGroup的dispatchTouchEvent沒調用super.dispatchTouchEvent而且返回true那麼Touch事件在此就終結了,後面將不會有任何和Touch有關的方法被調用。若是返回false那麼父View的onTouchEvent將被調用。   若是調用super.dispatchTouchEvent而且返回值爲true那麼父View的onTouchEvent將不會被調用。View同理di

onInterceptTouchEvent若是返回值爲true則表示Touch事件被攔截,子View的dispatchTouchEvent將不會被調用。該方法默認返回false,表示子View的dispatchTouchEvent將會被調用。vi

onTouchEvent該方法表示觸發了Touch事件。若是返回true則表示該事件當前View已經處理完了,父View不用管了。co

若是重寫了onTouchEvent但又沒有調用super.onTouchEvent那麼將會影響當前View的OnClickListener等事件的觸發。

總結

  1. dispatchTouchEvent/onTouchEvent任意一個返回true那麼事件在此終結。父View的onTouchEvent將不會被調用。

  2. super.dispatchTouchEvent用來調用子View的dispatchTouchEvent和本身的onTouchEvent

  3. super.onTouchEvent用來調用本身的OnClickListener等事件。

  4. onInterceptTouchEvent的返回值用來表示是否攔截傳遞給子View的事件。true表示子View的dispatchTouchEvent不被調用。

  5. 若是當前的View或ViewGroup有OnClickListener等方法那麼Touch將在此終結無論dispatchTouchEvent/onTouchEvent的返回值未何。

相關文章
相關標籤/搜索