Android觸摸事件流程剖析

Android中的觸摸事件流程就是指MotionEvent如何傳遞,主要包括兩個階段: ide

一、onInterceptTouchEvent觸摸事件攔截方法傳遞,從外到裏傳遞 this

二、onTouchEvent觸摸事件處理方法傳遞,從裏到外傳遞 spa

如今作一個例子探索觸摸事件的流程,效果圖以下: .net

image

從外到裏的視圖依次是ViewGroup一、ViewGroup二、View。 3d

ViewGroup1的觸摸相關方法以下(ViewGroup2相似): 日誌

private boolean intercept = false;//攔截方法返回的標誌位,是否攔截觸摸事件  @Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.e("touch", "MyViewGroup1 return " + this.intercept + " onInterceptTouchEvent " + ev.toString()); return this.intercept; } private boolean handle = false;//觸摸處理方法返回的標誌位,是否處理觸摸事件  @Override public boolean onTouchEvent(MotionEvent event) { Log.e("touch", "MyViewGroup1 return " + this.handle + " onTouchEvent " + event.toString()); return this.handle; }
View的觸摸相關方法以下(View並無onInterceptTouchEvent方法):
private boolean handle = false;//觸摸處理方法返回的標誌位,是否處理觸摸事件  @Override public boolean onTouchEvent(MotionEvent event) { Log.e("touch", "MyView return " + this.handle + " onTouchEvent " + event.toString()); return this.handle; }

如今點擊中間的View,Log日誌以下: code

image

總結1:在onInterceptTouchEvent和onTouchEvent中都返回false時,MotionEvent的ACTION_DOWN會走一遍傳遞和處理流程,而後就再沒有傳遞進來了。 事件

下面修改ViewGroup2觸摸事件攔截方法的標誌位而且截圖Log日誌 get

image

總結2:在觸摸事件傳遞的過程當中,若是遇到了一個onInterceptTouchEvent返回true,那麼表示再也不往下傳,直接今後View的onTouchEvent返回。 it

然而,咱們發現只有ACTION_DOWN事件傳進來了,其餘類型的觸摸都不會進來了,緣由是在全部的onTouchEvent中都返回了false,也就是他們都表示不會去處理這一次的觸摸事件,因此係統就不會自做多情再傳觸摸事件進來了。

要想系統不斷的傳遞觸摸事件進來,只能在某一個onTouchEvent中返回true,修改ViewGroup2的onTouchEvent標誌位並截圖Log日誌

image

總結3:當某個onTouchEvent返回true而且觸摸事件傳遞到這個方法時,表示本身要處理這個觸摸事件,再也不向上傳遞;後來的其餘類型的觸摸事件仍是會走一下onInterceptTouchEvent(但不會走到已經在處理觸摸事件的View以及以後的View的onInterceptTouchEvent),而後再傳給正在處理觸摸事件的View的onTouchEvent方法,而且此時也不會再向上傳遞。

因此咱們能夠獲得一些很是寶貴而且很是經常使用的技巧:

一、在onTouchEvent中處理咱們須要作的觸摸事件,而且返回true。

二、在onInterceptTouchEvent中獲取ACTION_DOWN、ACTION_MOVE、ACTION_UP等觸摸事件(可能只是獲取其中一兩種觸摸事件),而後判斷是否知足攔截的條件,在此以前返回false,一旦知足則返回true。

源代碼下載:http://www.oschina.net/action/code/download?code=54575&id=80556

相關文章
相關標籤/搜索