1. 程式人生 > >Android 觸控事件傳遞機制

Android 觸控事件傳遞機制

android系統中的每個View的子類都具有下面三個和TouchEvent處理密切相關的方法:
1)public boolean dispatchTouchEvent(MotionEvent ev)  這個方法用來分發TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 這個方法用來攔截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev) 這個方法用來處理TouchEvent

當 TouchEvent發生時,首先Activity將TouchEvent傳遞給最頂層的View,


1,View首先檢查dispatchTouchEvent這個函式的返回結果:
    (1)如果返回true ,則交給這個view的onTouchEvent處理。
    (2)如果返回false ,則交給這個 view 的 interceptTouchEvent 方法來決定是否要攔截這個事件。
2,然後如果輪到 onInterceptTouchEvent執行的話:
       (1)如果返回 true ,也就是攔截掉了,則交給這個view的onTouchEvent處理。
        (2)如果返回 false ,那麼就傳遞給子 view ,由子 view 的 dispatchTouchEvent 再來開始這個事件的分發。

3,如果事件傳遞到某一層的子view 的 onTouchEvent 上了:
        (1)如果返回 false ,那麼這個事件會從這個 view 往上傳遞,而且都是 onTouchEvent 來接收。而如果傳遞到最上面的 onTouchEvent 也返回 false 的話,這個事件就會“消失“。
        (2)如果返回true,那麼這個事件就會止於該view。
(注:可能你會覺得返回true或false有關係嗎,反正我已經針對事件編寫了處理程式碼?答案是有區別!比如ACTION_MOVE或者ACTION_UP發生的前提是一定曾經發生了ACTION_DOWN,如果你沒有消費ACTION_DOWN,那麼系統會認為ACTION_DOWN沒有發生過,所以ACTION_MOVE或者ACTION_UP就不能被捕獲。)