什么是事件分發(fā)虎韵?
簡單來說,就是我們通過屏幕與手機進行交互的時候缸废,每次的點擊包蓝,移動,長按等會產生一個個的事件企量。每一個事件又是通過屏幕傳遞給每一個View
测萎,View
接收到這些事件的時候可以對該事件的行進過程進行控制,也就是自己消費掉或者忽略掉届巩。
事件的常見類型
- ACTION_DOWN
手指按下的動作 - ACTION_MOVE
手指按下之后硅瞧,不包含按下的動作 - ACTION_UP
手指抬起的動作 - ACTION_CANCEL
事件取消
也就是說當手指按下屏幕開始,事件會按照一定的順序進行產生恕汇,知道手指離開屏幕腕唧,這樣的產生的一系列事件,我們會稱之為事件序列
瘾英。
當然不是每一種事件都會被執(zhí)行四苇,這個我們在之后做講解。
事件的傳遞的層級關系
在上面我們都在說當手指按下屏幕方咆,這里對于我們Android app開發(fā)者來說就對應了我們每一個Activity
,但是Activity
只負責聲明周期的變化蟀架,真正控制視圖的是每一個Activity
包含的window
瓣赂,window
中又包含了一個DecorView
,這里的DecorView
是一個頂級的view
片拍,所以view
中的所有事件都是要經過DecorView
才能傳遞到每一個view
當中煌集。
最終事件傳遞的層級關系如下圖所示:
由上可知事件傳遞的主要對象為
Activity
,ViewGroup
捌省,View
這三個苫纤。所以我們只需要研究事件在這三個對象間是怎么進行傳遞的。
Activity的事件分發(fā)流程
在Activity中,系統(tǒng)主要通過下面兩個方法進行事件傳遞:
- dispatchTouchEvent(android.view.MotionEvent ev)
- onTouchEvent(android.view.MotionEvent event)
下面看一下Activity的事件分發(fā)流程圖:
ViewGroup的事件分發(fā)流程
在ViewGroup中卷拘,系統(tǒng)主要通過下面三個方法進行事件傳遞
- dispatchTouchEvent(android.view.MotionEvent ev)
- onInterTouchevent(android.view.MotionEvent ev)
- onTouchEvent(android.view.MotionEvent event)
下面看一下ViewGroup的事件分發(fā)流程圖:
View的事件分發(fā)流程
在Activity中喊废,系統(tǒng)主要通過下面兩個方法進行事件傳遞:
- dispatchTouchEvent(android.view.MotionEvent ev)
- onTouchEvent(android.view.MotionEvent event)
在面試中盡可能的把這三個流程圖了解消化,可以簡要的畫U型圖去介紹三者的關系栗弟,在說的過程中盡量把每個對象的分發(fā)流程說清楚會有很好的加分污筷。