一直以來,都被android中的事件傳遞和處理機制深深的困擾!今天特意來好好的探討一下。現在的感覺是,只要你理解到位,其實事件的
傳遞和處理機制并沒有想象中的那么難。總之,不要自己打擊自己,要相信自己能掌握這塊知識。好了,下面是我今天的收獲,希望也
能對你有一點幫助。
一、擬人化來理解android中的事件機制
其實android中的事件傳遞與處理機制跟我們生活中的事件處理是一樣的。這里有一個生活中的例子,很能說明這個問題。闡述如下:
你是一個公司的員工,你的上頭有一個主管,主管上頭呢還有一個經理。為了簡單,你們這個團隊就有這三個人。那么如果上頭安排一件事下來要處理,流程是怎樣的呢?顯然應該是由你的經理將這件事安排給你的主管來處理,你的主管再將這件事安排給你來處理。等你把這件事辦好了,你就應該給你的主管報告,再由你的主管來向你的經理報告。顯然,你的主管和經理也有處理這件事的權限,如果他們覺得事情很復雜,你辦不了,或者他們比較照顧下級,可能就自己把這件事給辦了,這個時候這件事就不會再傳遞給下一級來處理了。這個事件處理的過程,是不是太容易理解了!
其實android中的事件處理流程就是跟生活中的事件處理是一樣的。比如你在ViewGroupA中嵌套了一個VewiGroupB,然后又在ViewGroupB
中嵌套了一個MyView。那么一個觸摸事件傳遞過來,會發生什么情況呢?類比上面的公司員工的處理事件,顯然會發生下面的過程:
觸摸事件傳遞過來后,ViewGroupA一看自己里面還有一個員工可以利用,就是ViewGroupB,那不用白不用,就會把這個事件傳遞給ViewGroupB,告訴他,你給我把這個事件處理了!
ViewGroupB呢一看,我不怕,我里面也有一個員工就是MyView,它得給我干活,于是又會把這個事件傳遞給MyView,讓它來處理。MyView一看,沒辦法啊,我手底下沒有員工了,那怎么辦,我只能自己處理了(前提是它有處理這個事件的能力),所以就把這個觸摸事件給處理了。處理完成后呢?MyView就是給ViewGroupB報告,我已經把事情辦好了,你來審核一下
,看看辦理的咋樣。ViewGroupB一審核,覺得不錯,就再將結果呈現給ViewGroupA。ViewGroupA再審核,通過了才算通過。在這個過程中,也可能出現幾種情況:
(1)MyView說,完蛋了,這事我的能力辦不好啊,于是就向VeiwGroupB報告,我沒有處理,請你來處理,你是我上司,能力比我強。于是ViewGroupB就會來幫忙處理。當然了,
如果ViewGroupB也沒能力處理,那就只能反饋給VeiwGroupA,讓它來消化這個事件。
(2)也可能MyView處理非常完美,向ViewGroupB一報告,ViewGroupB一開心就說不用再交給ViewGroupA審核了,我擔保通過,于是事件到此直接終止。
上面用很形象的話來講adnroid中的事件傳遞和處理機制講解了一下。android用下面的幾個方法將上面的過程完美封裝了:
在ViewGroup中,有下面三個方法:(1)dispatchTouchEvent 該方法用來分發事件,一般不會重寫這個方法(2)onInterceptTouchEvent 用來攔截事件(3)onTouchEvent 用來處理事件,這個方法應該大家很常見了吧而View中,只有兩個方法,即:(1)dispatchTouchEvent 該方法用來分發事件,一般不會重寫這個方法(2)onTouchEvent 用來處理事件,這個方法應該大家很常見了吧
那么我們就來寫一個實際的代碼,來驗證一下這些方法都對應上面的哪些過程。這樣子就會對這個些方法有更透徹的理解。
二、根據實戰代碼來分析各個方法
下面我們就來把上面提到的ViewGroupA,ViewGroupB,還有MyView給編寫出來。
新建一個項目,先來寫ViewGruopA,代碼如下:
package com.example.testmotionevent;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.LinearLayout;public class ViewGroupA extends LinearLayout{ public ViewGroupA(Context context) { super(context); } public ViewGroupA(Context context, AttributeSet attrs) { super(context, attrs); } public ViewGroupA(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.d("付勇
主站蜘蛛池模板:
延吉市|
綦江县|
仪征市|
陈巴尔虎旗|
砚山县|
德清县|
金昌市|
罗源县|
竹北市|
晋江市|
桐庐县|
宿松县|
东平县|
旬阳县|
丰台区|
大同县|
库尔勒市|
乌拉特后旗|
鹤峰县|
永平县|
平舆县|
乌兰浩特市|
从江县|
漳州市|
临高县|
班戈县|
海盐县|
安远县|
佳木斯市|
若羌县|
太原市|
三原县|
和静县|
宜宾县|
大安市|
天津市|
清远市|
呼和浩特市|
晋江市|
晋宁县|
克山县|