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將接受不到任何事件。