天天看點

自定義控件中onInterceptTouchEvent()和onTouchEvent()用法

詳細介紹

這2個方法容易混淆,在此記錄下,作為筆記。

onInterceptTouchEvent()是ViewGroup的一個方法,目的是在系統向該ViewGroup及其各個childView觸發onTouchEvent()之前對相關事件進行一次攔截

由于ViewGroup會包含若幹childView,是以需要能夠統一監控各種touch事件的機會,是以純粹的不能包含子view的控件是沒有這個方法的,如LinearLayout就有,TextView就沒有。

onInterceptTouchEvent()使用也很簡單,如果在ViewGroup裡覆寫了該方法,那麼就可以對各種touch事件加以攔截。但是如何攔截,是否所有的touch事件都需要攔截則是比較複雜的,touch事件在onInterceptTouchEvent()和onTouchEvent以及各個childView間的傳遞機制完全取決于onInterceptTouchEvent()和onTouchEvent()的傳回值。并且,針對down事件處理的傳回值直接影響到後續move和up事件的接收和傳遞。

關于傳回值的問題,基本規則很清楚,如果return true,那麼表示該方法消費了此次事件,如果return false,那麼表示該方法并未處理完全,該事件仍然需要以某種方式傳遞下去繼續等待處理。

具體是這樣的:

1、onInterceptTouchEvent()是用于處理事件(類似于預處理,當然也可以不處理)并改變事件的傳遞方向,也就是決定是否允許Touch事件繼續向下(子控件)傳遞,

傳回True(代表事件在目前的viewGroup中會被處理),則向下傳遞之路被截斷(所有子控件将沒有機會參與Touch事件),同時把事件傳遞給目前的控件的onTouchEvent()處理;

傳回false,則把事件交給子控件onInterceptTouchEvent()

2、onTouchEvent()用于處理事件,傳回值決定目前控件是否消費(consume)了這個事件,也就是說在目前控件在處理完Touch事件後,是否還允許Touch事件繼續向上(父控件)傳遞.

傳回True,不向上傳遞給父控件 (自己消費了) 那麼它的touch事件都在這裡處理,父控件是處理不了,因為它收不到子控件傳給他的touch,被子控件給攔截了

傳回false,則向上傳遞給父控件,詳細一點就是這個touch事件就給了父控件,那麼後面的up事件就是到這裡touch觸發,不會在傳給它的子控件。如果父控件依然是false,那touch的處理就給到父控件的父控件,那麼up的事件處理都在父控件的父控件,不會觸發下面的。

舉個例子:

onInterceptTouchEvent()是ViewGroup的一個方法,目的是在系統向該ViewGroup及其各個childView觸發onTouchEvent()之前對相關事件進行一次攔截.

  1. down事件首先會傳遞到ViewGroup 的onInterceptTouchEvent()方法
  2. 如果該ViewGroup的onInterceptTouchEvent()在接收到down事件處理完成之後return false(表示不攔截,向下傳遞給childView的onInterceptTouchEvent()),那麼後續的move, up等事件将繼續會先傳遞給該ViewGroup,之後才和down事件一樣傳遞給最終的目标view的onTouchEvent()處理(父視圖沒有攔截都交給子視圖)。
  3. 如果該ViewGroup的onInterceptTouchEvent()在接收到down事件處理完成之後return true(攔截,不向下傳遞,子childView接收不到任何事件),那麼後續的move, up等事件将不再傳遞給onInterceptTouchEvent(),而是和down事件一樣傳遞給該ViewGroup的onTouchEvent()處理,注意,目标view将接收不到任何事件。
  4. 如果最終需要處理事件的view的onTouchEvent()傳回了false(需要傳遞給上級視圖ViewGroup的onTouchEvent()),那麼該事件将被傳遞至其上一層次的view的onTouchEvent()處理。
  5. 如果最終需要處理事件的view 的onTouchEvent()傳回了true(子view消費目前,不向上傳遞),那麼後續事件将可以繼續傳遞給該view的onTouchEvent()處理

**ViewGroup裡的onInterceptTouchEvent預設值是false這樣才能把事件傳給View裡的onTouchEvent.

ViewGroup裡的onTouchEvent預設值是false。

View裡的onTouchEvent傳回預設值是true.這樣才能執行多次touch事件。**

具體例子可以參考:

http://blog.csdn.net/lvxiangan/article/details/9309927