Android 讓人又愛又恨的觸摸機制(一)

概述:

在任何開發的過程中,都會存在各類Bug須要不斷的調試去解決。而在Android中,天然也少不了各類蛋疼的「福利」,而在其中,觸摸機制絕對是一塊難啃的骨頭。前段時間也一直說要寫寫關於這方面的文章,卻遲遲沒有下筆,今天抽空將本身平時的想法整理成文吧。有任何問題歡迎拍磚。android

另外,日常雖然喜歡以代碼來講明問題和內容,可是觸摸機制,我的認爲必須先理清思路再去理解代碼,再理清思路,會使得整個理解過程更加的透徹和明瞭。spa

觸摸機制的基礎:

Android的視圖類View都支持事件觸摸機制。你能夠在你的基礎控件或者你的Activities中對觸摸事件作出必定的反應。安卓支持多點觸摸,好比將你的幾個手指和屏幕進行接觸,一樣能夠對其進行必定的控制。調試

而觸摸機制的基礎類是MotionEvent,而該類經過onTouchEvent方法將事件傳遞到視圖中。若是你想要對觸摸事件作出反饋,也就是交互,那麼你須要重寫OnTouchEvent方法。而在MotionEvent類中包含了與觸摸相關的一些信息參數,好比觸摸的點的數量、x/y的座標值和大小以及每一個點的壓力值。而且若是該方法返回true的話,那麼此次觸摸時間就被消費掉了
xandroidtouch10.png.pagespeed.ic.P0F_sA_glU事件

觸摸機制的過程:

Android系統會找到最裏面的一個返回true的試圖來處理此次的觸摸事件。若是這個視圖是另一個試圖(父視圖)的一部分,那麼父視圖能夠經過oninterceptTouchEvent方法返回true來消費掉此次的觸摸事件。而該操做將會給上一個收到該事件的試圖一個MotionEvent.ACTION_CANCEL的事件信息。
QQ圖片20140318222949圖片

如何觸發該機制:

在一個Activity中與觸摸事件進行交互,只要在相關的視圖中註冊一個事件觸摸監聽器(onTouchListener)就能夠了。另一種方法是自定義控件中複寫onTouchEvent()方法,來進行具體的觸摸事件反應。開發

看完上面幾段話必定會很糊塗,什麼是OnInterceptionTouchEvent?什麼是onTouchEvent?還有一個dispatchTouchEvent是什麼呢?
其實在android中的View的子類都具備這三個方法,換言之,只要你是視圖類,那麼你就能夠複寫這三個方法,從而達到本身的目的,由於這三個方法和觸摸機制密切相關。get

1)boolean dispatchTouchEvent
從字面意思着手,能夠猜到它是用來分發TouchEvent事件的,能夠理解爲快遞員分發快遞。
2)boolean oninterceptTouchEvent
intercept打斷的意思,那麼可知這個方法是用來攔截TouchEvent,好比某個用戶忽然不想發送快遞了,那麼趕忙攔截吧。
3)boolean onTouchEvent
這個就好理解了,就是對TouchEvent觸摸事件的處理,好比這個快件是送到上海的仍是送到北京的。具體的處理內容全都在這個方法中。
it

其實掌握了這三個方法,那麼你就掌握了觸摸機制的一半了,可是這三個方法卻不是那麼好掌握和理解的。io

當TouchEvent發生的時候,整個觸摸傳遞的過程,就是上述三個方法的不斷交替和選擇。首先當你的手指觸摸到屏幕的時候,Activity將TouchEvent傳遞給最頂層的View,那麼這時候上面三個方法將會決定他的走向.若是dispatchTouchEvent返回true,那麼很簡單,這個最頂層的View將會觸發onTouchEvent方法對該觸摸事件進行處理。若是返回的是false,那麼首先他將傳遞給這個View的interceptTouchEvent方法來決定是否要攔截這個事件,若是攔截也就是返回true,那麼將依舊交給他的onTouchEvent來處理;相反,若是返回的是false那麼將會繼續傳遞給他的子View,依此類推動行傳遞。若是時間傳遞到某一層的子View的onTouchEvent上而且返回的是false,那麼這個時間將不會繼續往下傳遞,而是往外傳遞,而且都是由onTouchEvnet來接受。直到某個View返回True消費掉,或者一直返回false,直到此次事件永遠消失。class

OK,第一篇不以代碼明示,第二篇將以代碼驗證上述過程和具體的實現原理。

原文地址,也就是本文個人首發地址:http://jackyonline.org/archives/816

相關文章
相關標籤/搜索