Android 事件傳遞機制

Android事件構成

在Android中,事件主要包括點按、長按、拖拽、滑動等,點按又包括單擊和雙擊,另外還包括單指操做和多指操做。全部這些都構成了Android中的事件響應。總的來講,全部的事件都由以下三個部分做爲基礎:java

  • 按下(ACTION_DOWN)佈局

  • 移動(ACTION_MOVE)spa

  • 擡起(ACTION_UP)code

全部的操做事件首先必須執行的是按下操做(ACTIONDOWN),以後全部的操做都是以按下操做做爲前提,當按下操做完成後,接下來多是一段移動(ACTIONMOVE)而後擡起(ACTION_UP),或者是按下操做執行完成後沒有移動就直接擡起。這一系列的動做在Android中均可以進行控制。orm

咱們知道,全部的事件操做都發生在觸摸屏上,而在屏幕上與咱們交互的就是各類各樣的視圖組件(View),在Android中,全部的視圖都繼承於View,另外經過各類佈局組件(ViewGroup)來對View進行佈局,ViewGroup也繼承於View。全部的UI控件例如Button、TextView都是繼承於View,而全部的佈局控件例如RelativeLayout、容器控件例如ListView都是繼承於ViewGroup。因此,咱們的事件操做主要就是發生在View和ViewGroup之間,那麼View和ViewGroup中主要有哪些方法來對這些事件進行響應呢?記住以下3個方法,咱們經過查看View和ViewGroup的源碼能夠看到:繼承

View.java事件

public boolean dispatchTouchEvent(MotionEvent event)
public boolean onTouchEvent(MotionEvent event)

ViewGroup.java源碼

public boolean dispatchTouchEvent(MotionEvent event)
public boolean onTouchEvent(MotionEvent event) 
public boolean onInterceptTouchEvent(MotionEvent event)

在View和ViewGroup中都存在dispatchTouchEvent和onTouchEvent方法,可是在ViewGroup中還有一個onInterceptTouchEvent方法,那這些方法都是幹嗎的呢?別急,咱們先看看他們的返回值。這些方法的返回值所有都是boolean型,爲何是boolean型呢,看看本文的標題,「事件傳遞」,傳遞的過程就是一個接一個,那到了某一個點後是否要繼續往下傳遞呢?你發現了嗎,「是否」二字就決定了這些方法應該用boolean來做爲返回值。沒錯,這些方法都返回true或者是false。在Android中,全部的事件都是從開始通過傳遞到完成事件的消費,這些方法的返回值就決定了某一事件是不是繼續往下傳,仍是被攔截了,或是被消費了。it

接下來就是這些方法的參數,都接受了一個MotionEvent類型的參數,MotionEvent繼承於InputEvent,用於標記各類動做事件。以前提到的ACTIONDOWN、ACTIONMOVE、ACTION_UP都是MotinEvent中定義的常量。咱們經過MotionEvent傳進來的事件類型來判斷接收的是哪種類型的事件。到如今,這三個方法的返回值和參數你應該都明白了,接下來就解釋一下這三個方法分別在何時處理事件。io

  • dispatchTouchEvent方法用於事件的分發,Android中全部的事件都必須通過這個方法的分發,而後決定是自身消費當前事件仍是繼續往下分發給子控件處理。返回true表示不繼續分發,事件沒有被消費。返回false則繼續往下分發,若是是ViewGroup則分發給onInterceptTouchEvent進行判斷是否攔截該事件。

  • onTouchEvent方法用於事件的處理,返回true表示消費處理當前事件,返回false則不處理,交給子控件進行繼續分發。

  • onInterceptTouchEvent是ViewGroup中才有的方法,View中沒有,它的做用是負責事件的攔截,返回true的時候表示攔截當前事件,不繼續往下分發,交給自身的onTouchEvent進行處理。返回false則不攔截,繼續往下傳。這是ViewGroup特有的方法,由於ViewGroup中可能還有子View,而在Android中View中是不能再包含子View的(iOS能夠)。

相關文章
相關標籤/搜索