Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 淺談android事件分發,攔截,處理

淺談android事件分發,攔截,處理

編輯:關於Android編程

事件分發

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方法中處理,下圖

\

onInterceptTouchEvent方法,也是我們寫自定義view的時候解決事件沖突的地方<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPrWxztLDx7XEVmlld0dyb3VwQrXEb25JbnRlcmNlcHRUb3VjaEV2ZW50t7W72HRydWXE2KO/1K3A7dK70fk8L3A+DQo8cD48aW1nIGFsdD0="" src="/uploadfile/Collfiles/20160331/20160331090548236.png" title="\" />

當然,onIntercaptTouchEvent是viewGroup的方法,只有viewGroup才能決定事件是否攔截,而我們的view沒有onInterceptTouchEvent方法

在onTouchEvent中返回true

我們知道返回true,是將事件由我們自己的view處理了,那麼事件被消耗了的話,流程圖有什麼不同呢?這裡我們先讓我們的view的onTouchEvent返回true

\

如果讓我們的viewGroupB處理事件呢?我們也可以推測出來了

我們從打印的log可以看出來,當我們對事件進行攔截之後,下次的事件,直接交給了ViewGroupB處理,這個也是考慮了優化了

接下來我們將由我們的頂級控件,ViewGroupA來處理我們的事件響應,那麼應該是什麼效果呢?

結果我們可以想到,正常的流程還是會走,直到我們的ViewGroupA的onTouchEvent方法調用了,那麼下次的事件也是直接交給處理事件的控件直接處理。

#

總的來說我們已經通過Log來詳細的分析了事件的三個方法,現在大家應該很清晰時間流程了

總結
當我們在dispatchTouchEvent中返回true的話,那麼事件將不會分發如果我們調用了onInterceptTouchEvent返回true的話,那麼事件將會攔截,交給攔截事件的view處理,會 調用onTouchEvent方法如果我們的onTouchEvent返回true的話,那麼事件將會被消耗,下次的事件不會再向下傳遞,而是直接由處理的事件的控件攔截,之後交給剛才的控件處理相關事件一般我們自定義view的時候會在onIntercaptTouchEvent方法中處理事件沖突,來決定是否攔截事件而我們會在onTouchEvent中直接返回true,表示如果子控件不處理的話,那麼我們的自定義view將會處理所有的事件 view沒有onIntercaptTouchEvent方法    
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved