1. 程式人生 > >Android事件分發總結

Android事件分發總結

    從今天開始寫讀書筆記,希望自己每天都可以堅持下來,在Android開發的道路上越走越遠。

    一、事件分發的物件及其方法。

    Android事件分發的物件有2個,View和ViewGroup。

    View的事件有2個:dispatchTouchEvent() 和 onTouchEvent()

    ViewGroup的事件有3個:dispatchTouchEvent() 、 onTouchEvent() 和 onInterceptTouchEvent()

    二、觸控事件的型別。

    觸控事件對應的是MotionEvent類,事件的主要型別有3種。

    ACTION_DOWN:使用者手指按下操作,一次按下操作標誌著一次觸控事件的開始。

    ACTION_MOVE:使用者按下之後,手指在螢幕上滑動的操作。

    ACTION_UP:    使用者手指離開螢幕,一次提起操作標誌著一次觸控事件的結束。

    一次完整的Touch事件,至少由1次ACTION_DOWN和1次ACTION_UP和若干個(可以為0)ACTION_MOVE事件組成。

    三、事件傳遞的三個階段。

    分發(Dispatch):事件的分發對應著dispatchTouchEvent方法,在Android系統中,所有的觸控事件都是通過這個方法來分發的。方法返回為true則表示該事件被消費,不往下進行分發,否則,進行事件分發。

    攔截(Intercept):事件的攔截對應著onInterceptTouchEvent方法,這個方法只在ViewGroup及其子類中才存在。返回true表示攔截這個事件,不繼續分發給子檢視,同時交由自身的onTouchEvent方法進行消費,否則表示不對事件進行攔截,需要繼續分發給子檢視。

    消費(Consume):事件的消費對應著onTouchEvent方法,該方法返回true表示當前檢視可以處理對應的事件,事件將不會向上傳遞給父檢視;返回false表示當前檢視不處理這個事件,事件會被傳遞給父檢視的onTouchEvent方法進行處理。

    四、事件分發流程圖。

    1.View的一次點選事件圖:

    

    2.ViewGroup中的View的點選事件流程:

    

    五、總結。

    1.事件分發都是從外層向內層進行分發,若不干涉,則會傳遞到檢視底層進行事件處理;

    2.ViewGroup通過onInterceptTouchEvent方法對事件進行攔截,如果該方法返回true,則事件不會傳遞到子View;

    3.在子View中對事件進行消費後,ViewGroup將接受不到任何事件。