Android學習之Touch事件的處理

這是一篇老文章,移到個人新博客中,沒看過的,能夠看看。android

在移動開發過程中,咱們常常會遇到手勢處理和事件觸摸的狀況,若是不瞭解整個事件的處理機制,對於開發的同窗和碼農是很是痛苦的,可是事件觸摸的處理確實是一個很是複雜的過程,細講起來,估計我都能講迷糊,這裏呢,我只作一些簡單的和經常使用事件的講解,但願可以幫助你們。程序員

概念,什麼是事件的派發

事件的派發簡單來說就是Activity將事件派發給容器和控件,容器或控件將事件進一步派發給其子容器和子控件,直到事件最終派發到事件發生的焦點控件上。微信

經常使用的事件觸摸方法

我想對於這些經常使用的事件觸摸方法你們都應該有必定的瞭解,或者熟悉,那就是onTouchEvent()和dispatchTouchEvent(),OnInterceptTouchEvent(),看到方法後,相信你很快就會說,對我用過,可是具體的意思沒有搞清楚,看別人這麼說的,別人這麼用的,我就跟着這麼用的,用以前,對於這些方法咱們必定要搞清其做用,這樣才能在作起來有的放矢。如今咱們就來介紹一下這三種方法的大概用法和做用。
<!--more-->spa

Boolean onTouchEvent()

做用:處理本次觸摸事件。code

解釋:若是某個控件或容器消費了touch事件,則與該touch事件相關的後續touch事件者會派發給該控件或容器進行處理。事件

返回值:該方法的返回值機理與鍵盤響應事件的相同,一樣是當已經完整地處理了該事件且不但願其餘回調方法再次處理時返回true,不然返回false。開發

通常狀況下如下三種狀況的事件所有由onTouchEvent方法處理,只是三種狀況中的動做值不一樣。get

屏幕被按下:當屏幕被按下時,會自動調用該方法來處理事件,此時MotionEvent.getAction()的值爲MotionEvent.ACTION_DOWN,若是在應用程序中須要處理屏幕被按下的事件,只需從新該回調方法,而後在方法中進行動做的判斷便可。博客

屏幕被擡起:當觸控筆離開屏幕時觸發的事件,該事件一樣須要onTouchEvent方法來捕捉,而後在方法中進行動做判斷。當MotionEvent.getAction()的值爲MotionEvent.ACTION_UP時,表示是屏幕被擡起的事件。it

在屏幕中拖動:該方法還負責處理觸控筆在屏幕上滑動的事件,一樣是調用MotionEvent.getAction()方法來判斷動做值是否爲MotionEvent.ACTION_MOVE再進行處理。

Boolean OnInterceptTouchEvent()

做用:是否攔截觸摸事件,true表示攔截,faIse表示不攔截。

解釋:onInterceptTouchEvent這個事件是從父控件開始往子控件傳的,直到有攔截或者到沒有這個事件的view,而後就往回從子到父控件,(相似於預處理,固然也能夠不處理)並改變事件的傳遞方向,也就是決定是否容許Touch事件繼續向下(子控件)傳遞,一但返回True(表明事件在當前的viewGroup中會被處理),則向下傳遞之路被截斷(全部子控件將沒有機會參與Touch事件),同時把事件傳遞給當前的控件的onTouchEvent()處理;返回false,則把事件交給子控件的onInterceptTouchEvent()。

void dispatchTouchEvent()

做用:將觸摸事件向下層的ViewGroup或View派發。

解釋:當TouchEvent發生時,首先Activity將TouchEvent傳遞給最頂層的View, TouchEvent最早到達最頂層 view 的 dispatchTouchEvent ,而後由 dispatchTouchEvent 方法進行分發,若是dispatchTouchEvent返回true ,則交給這個view的onTouchEvent處理,若是dispatchTouchEvent返回 false ,則交給這個 view 的 interceptTouchEvent 方法來決定是否要攔截這個事件,若是 interceptTouchEvent 返回 true ,也就是攔截掉了,則交給它的 onTouchEvent 來處理,若是 interceptTouchEvent 返回 false ,那麼就傳遞給子 view ,由子 view 的 dispatchTouchEvent 再來開始這個事件的分發。若是事件傳遞到某一層的子 view 的 onTouchEvent 上了,這個方法返回了 false ,那麼這個事件會從這個 view 往上傳遞,都是 onTouchEvent 來接收。而若是傳遞到最上面的 onTouchEvent 也返回 false 的話,這個事件就會「消失」,並且接收不到下一次事件。

咱們經常使用的ACTION常量

public static final int ACTION_DOWN=0
做用:表示按下的狀態。

public static final int ACTION_ UP=1
做用:表示擡起的狀態。

public static final int ACTION_MOVE=2
做用:表示移動的狀態。

特別注意

ViewGroup裏的onInterceptTouchEvent默認值是false這樣才能把事件傳給View裏的onTouchEvent.

ViewGroup裏的onTouchEvent默認值是false。

View裏的onTouchEvent返回默認值是true.這樣才能執行屢次touch事件

移動開發者的彙集地,公衆號「非著名程序員」,天天一篇原創技術分享和移動互聯網知識分享,微信公衆號:smart_android,頭條號和百度百家帳號都是「非著名程序員」。

相關文章
相關標籤/搜索