標籤:
事件分發
- android事件處理的時候 會根據事件發生的座標,從父容器一直慢慢的發送到相關的所有的view
- 因此當都不處理的時候 事件傳遞的流程圖
dispatchTouchEvent返回true
- 但是如果我們在A的dispatchTouchEvent 中返回true,那麼也就是事件不進行分發
- 發現只是調用了ViewGroupA事件的攔截方法,也就是沒有將事件進行分發,連自己的onTouchEvent事件都沒有進行處理
- 如果讓ViewGroupB的dispatchEvent返回true呢?
- 當我們的view的dispatchTouchEvent返回true呢?現在我們可以推測了AdispatchTouchEvnet–>AonInterceptTouchEvent–>BdispatchTouchEvent–>BonInterceptTouchEvent–>CdispatchTouchEvent
onIntercaptTouchEvent返回true
- 當我們的ViewGroupA的onInterceptTouchEvent返回true的時候,也就是我們的ViewGroupA決定進行事件攔截
- 正如我們知道的,當對事件攔截之後直接進入自己view的touchEvent方法中處理,
- 當然,onIntercaptTouchEvent是viewGroup的方法,只有viewGroup才能決定事件是否攔截,而我們的view沒有onInterceptTouchEvent方法
在onTouchEvent中返回true
- 我們知道返回true,是將事件由我們自己的view處理了,那麼事件被消耗了的話,流程圖有什麼不同呢?
- 這裡我們先讓我們的view的onTouchEvent返回true
- 結果我們可以想到,正常的流程還是會走,直到我們的ViewGroupA的onTouchEvent方法調用了,那麼下次的事件也是直接交給處理事件的控制項直接處理。
#總的來說我們已經通過Log來詳細的分析了事件的三個方法,現在大家應該很清晰時間流程了
- 總結
- 當我們在dispatchTouchEvent中返回true的話,那麼事件將不會分發
- 如果我們調用了onInterceptTouchEvent返回true的話,那麼事件將會攔截,交給攔截事件的view處理,會 調用onTouchEvent方法
- 如果我們的onTouchEvent返回true的話,那麼事件將會被消耗,下次的事件不會再向下傳遞,而是直接由處理的事件的控制項攔截,之後交給剛才的控制項處理相關事件
- 一般我們自訂view的時候會在onIntercaptTouchEvent方法中處理事件衝突,來決定是否攔截事件
- 而我們會在onTouchEvent中直接返回true,表示如果子控制項不處理的話,那麼我們的自訂view將會處理所有的事件
- view沒有onIntercaptTouchEvent方法
android事件分發,攔截,處理