日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android之事件处理全面剖析

發(fā)布時(shí)間:2023/12/4 Android 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android之事件处理全面剖析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載:http://blog.csdn.net/jxxfzgy/article/details/43926987

Android 事件處理機(jī)制說(shuō)難也不難,說(shuō)簡(jiǎn)單也不簡(jiǎn)單,為什么這么說(shuō)呢?因?yàn)槲蚁嘈糯蟛糠钟辛艘欢?Android 基礎(chǔ)的同學(xué),想要分析 Android 事件處理機(jī)制,都是可以分析出來(lái)了;但要靈活運(yùn)用它卻又覺(jué)得很吃力,而且往往需要查閱各種資料文檔,才能真正把它運(yùn)用起來(lái)。今天我?guī)ьI(lǐng)大家對(duì) Android 事件處理機(jī)制做一次全方位的分析,從而達(dá)到大家對(duì) Android 事件處理有一個(gè)更深、更形象的認(rèn)識(shí)!

一、初體驗(yàn):?
相信大部分的人對(duì) Android 事件處理機(jī)制的分析,都是通過(guò)打印 log 的方式,這里也是通過(guò)這種方式來(lái)分析;首先準(zhǔn)備三個(gè)類 MainActivity 、EventLayout 、EventTextView ,這幾個(gè)類分別是什么都做了些什么呢?我們看看代碼就知道。?
1、MainActivity

public class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {boolean handle = false ;String str = "ACTION_DOWN";switch (ev.getAction()){case MotionEvent.ACTION_DOWN:str = "ACTION_DOWN";break ;case MotionEvent.ACTION_MOVE:str = "ACTION_MOVE";handle = true ;break;case MotionEvent.ACTION_UP:str = "ACTION_UP";break;}Log.v("zgy","=====Activity=====dispatchTouchEvent========"+str) ;return super.dispatchTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {String str = "ACTION_DOWN";boolean handle = false ;switch (event.getAction()){case MotionEvent.ACTION_DOWN:str = "ACTION_DOWN";break ;case MotionEvent.ACTION_MOVE:str = "ACTION_MOVE";handle = true ;break;case MotionEvent.ACTION_UP:str = "ACTION_UP";break;}Log.v("zgy","=====Activity=====onTouchEvent========"+str) ;return super.onTouchEvent(event);} }
2、EventLayout

/*** Created by gyzhong on 15/2/18.*/ public class EventLayout extends LinearLayout {public EventLayout(Context context) {super(context);}public EventLayout(Context context, AttributeSet attrs) {super(context, attrs);}public EventLayout(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {String str = "ACTION_DOWN";switch (ev.getAction()){case MotionEvent.ACTION_DOWN:str = "ACTION_DOWN";break ;case MotionEvent.ACTION_MOVE:str = "ACTION_MOVE";break;case MotionEvent.ACTION_UP:str = "ACTION_UP";break;}Log.v("zgy", "=====ViewGroup=====onInterceptTouchEvent========"+str) ;if(handle){return handle ;}return super.onInterceptTouchEvent(ev);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {boolean handle = false ;switch (ev.getAction()){case MotionEvent.ACTION_DOWN:str = "ACTION_DOWN";break ;case MotionEvent.ACTION_MOVE:str = "ACTION_MOVE";break;case MotionEvent.ACTION_UP:str = "ACTION_UP";break;}Log.v("zgy", "=====ViewGroup=====dispatchTouchEvent========"+str) ;if(handle){return handle ;}return super.dispatchTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {String str = "ACTION_DOWN";switch (event.getAction()){case MotionEvent.ACTION_DOWN:str = "ACTION_DOWN";break ;case MotionEvent.ACTION_MOVE:str = "ACTION_MOVE";break;case MotionEvent.ACTION_UP:str = "ACTION_UP";break;}Log.v("zgy","=====ViewGroup=====onTouchEvent========"+str) ;return super.onTouchEvent(event);} } 3、EventTextView

/*** Created by gyzhong on 15/2/18.*/ public class EventTextView extends TextView {public EventTextView(Context context) {super(context);}public EventTextView(Context context, AttributeSet attrs) {super(context, attrs);}public EventTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {String str = "ACTION_DOWN";switch (ev.getAction()){case MotionEvent.ACTION_DOWN:str = "ACTION_DOWN";break ;case MotionEvent.ACTION_MOVE:str = "ACTION_MOVE";break;case MotionEvent.ACTION_UP:str = "ACTION_UP";break;}Log.v("zgy", "=====View=====dispatchTouchEvent========"+str+ ",getX() ="+ev.getX()) ;return super.dispatchTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {String str = "ACTION_DOWN";boolean handle = false ;switch (event.getAction()){case MotionEvent.ACTION_DOWN:str = "ACTION_DOWN";break ;case MotionEvent.ACTION_MOVE:str = "ACTION_MOVE";break;case MotionEvent.ACTION_UP:str = "ACTION_UP";break;}Log.v("zgy","=====View=====onTouchEvent========"+str) ;return super.onTouchEvent(event);} } 通過(guò)代碼可以看到,3個(gè)類基本上什么都沒(méi)做,只是重寫(xiě)了父類的dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent方法,也只是在其中加入了調(diào)試信息,那再來(lái)看看 xml

<com.gyzhong.eventdemo.EventLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:layout_gravity="center_horizontal" ><com.gyzhong.eventdemo.EventTextViewandroid:layout_width="120dp"android:layout_height="60dp"android:gravity="center"android:text="eventText"/> </com.gyzhong.eventdemo.EventLayout> 這里把我們重寫(xiě)的 自定義的 View 放入布局中。運(yùn)行代碼,開(kāi)始調(diào)試,然后點(diǎn)擊EventTextView可以看到 log 信息:

=====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====ViewGroup=====onTouchEvent========ACTION_DOWN =====Activity=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UP 通過(guò)信息和結(jié)合我們所學(xué)的知識(shí)點(diǎn),還是很容易得出結(jié)論來(lái):?
Activity 的 dispatchTouchEvent的事件分發(fā)給ViewGroup,ViewGroup先通過(guò)事件攔截onInterceptTouchEvent(只有 ViewGroup 才有此方法)來(lái)判斷,是否攔截,如果沒(méi)有攔截則將事件分發(fā)給 View 的分發(fā)機(jī)制dispatchTouchEvent;View 獲取到事件后,就開(kāi)始調(diào)用 onTouchEvent 方法,如果 View 的 onTouchEvent 未把事件消費(fèi)掉,則把事件有傳遞給 ViewGroup 的 onTouchEvent,同理,ViewGroup 未把事件消費(fèi)掉,繼續(xù)往下級(jí)傳到了 Activity 的 onTouchEvent 事件處理中。文字講解終究是有點(diǎn)難理解,需要結(jié)合圖文來(lái)講解,那么我們來(lái)看下下面這張圖,應(yīng)該很清晰明了。?


通過(guò)上圖,我們可以得出以下幾點(diǎn)結(jié)論:?
1、Android 事件傳遞是層級(jí)傳遞的;?
2、dispatchTouchEvent從底層向上層傳遞,而onTouchEvent剛好相反;?
3、onInterceptTouchEvent返回為 true 時(shí),將執(zhí)行同層級(jí)的onTouchEvent,而dispatchTouchEvent和onTouchEvent返回 true 時(shí),將終止事件的傳遞。?
上面我們提到了兩個(gè)關(guān)鍵詞,攔截和消費(fèi),其實(shí)都是圖片中表示的 return 返回值,在 dispatchTouchEvent 我們習(xí)慣用攔截,而在 onTouchEvent 中則習(xí)慣用消費(fèi)來(lái)說(shuō)明(個(gè)人習(xí)慣而已)。return false 表示事件未被dispatchTouchEvent攔截,也未被onTouchEvent消費(fèi)。好了,到此我們的Android 事件處理機(jī)制分析完了,感謝大家的閱讀。汗、汗、汗、、、 真的分析完了嗎,如果只是這樣就結(jié)束了,我也不會(huì)在大過(guò)年的,在這里苦逼苦逼的寫(xiě) blog。那么接下來(lái)我們進(jìn)入第二階段。

二、深度剖析?
還記得前面第一階段的標(biāo)題”初體驗(yàn)”為什么叫初體驗(yàn)?zāi)?#xff1f;大致可以認(rèn)為是我們的第一印象,我們最初感覺(jué)出來(lái)的東西。無(wú)論是根據(jù)自己的邏輯來(lái)推理,還是根據(jù)剛剛我們看到的調(diào)試信息來(lái)看,事件處理機(jī)的制整體流程都是按照上面圖1-1的流程來(lái)走的。但是,細(xì)心的同學(xué)肯定看到了最后兩行調(diào)試信息

=====Activity=====dispatchTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UP 對(duì),你沒(méi)有看錯(cuò),我也沒(méi)有調(diào)錯(cuò),ACTION_UP的時(shí)候它確實(shí)只打印了兩行,并都是在 Activity 中打印的。并不像 ACTION_DOWN 的時(shí)候執(zhí)行了

=====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====ViewGroup=====onTouchEvent========ACTION_DOWN =====Activity=====onTouchEvent========ACTION_DOWN 也許這樣看還不明顯,再來(lái)看看一下調(diào)試信息

=====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====ViewGroup=====onTouchEvent========ACTION_DOWN =====Activity=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UP 這里可以看到只有在 ACTION_DOWN 的時(shí)候是按照我們分析的流程圖來(lái)執(zhí)行,而 ACTION_MOVE、ACTION_UP 都只是執(zhí)行了 Activity 的dispatchTouchEvent和onTouchEvent,這是為什么?難道我們不是按照上面那張流程圖的流程來(lái)執(zhí)行?這里我可以肯定的告訴大家,上面那張圖的流程是絕對(duì)沒(méi)有問(wèn)題的,只是有些事件被攔截或消費(fèi)掉。并且這里告訴大家一個(gè)結(jié)論:?
ViewGroup 和 View的dispatchTouchEvent分發(fā)事件在 action 為ACTION_DOWN時(shí)沒(méi)有被攔截且onTouchEvent的處理事件在 action 為ACTION_DOWN時(shí)未被消費(fèi),當(dāng) action 為ACTION_MOVE或ACTION_UP時(shí),dispatchTouchEvent和onTouchEvent只有在 activity 被調(diào)用。想搞清楚和驗(yàn)證這個(gè)結(jié)論的同學(xué),可以自己根據(jù)源碼深入探究!?
通過(guò)以上結(jié)論,可知,在手指滑動(dòng)或者抬起的時(shí)候,ViewGroup 和 View 的dispatchTouchEvent和onTouchEvent未被執(zhí)行,因?yàn)槭录幢粩r截或者消費(fèi)。?
我在網(wǎng)上看過(guò)一些 Android 事件處理機(jī)制的帖子和 bolg,我記得有這樣一個(gè)問(wèn)題,為什么我在分析 Android 事件處理的時(shí)候,用 TextView 和 Button ,分析出來(lái)的結(jié)果不一樣呢?這里我們用的是 TextView 分析的,我們也來(lái)看看 Button 的效果,到底哪里不一樣。新建一個(gè) EventButton類和 EventTextView 一樣,除了繼承的對(duì)象不同之外。

EventButton /*** Created by gyzhong on 15/2/18.*/ public class EventButton extends Button {public EventButton(Context context) {super(context);}public EventButton(Context context, AttributeSet attrs) {super(context, attrs);}public EventButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {String str = "ACTION_DOWN";switch (ev.getAction()){case MotionEvent.ACTION_DOWN:str = "ACTION_DOWN";break ;case MotionEvent.ACTION_MOVE:str = "ACTION_MOVE";break;case MotionEvent.ACTION_UP:str = "ACTION_UP";break;}Log.v("zgy", "=====View=====dispatchTouchEvent========"+str+ ",getX() ="+ev.getX()) ;return super.dispatchTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {String str = "ACTION_DOWN";boolean handle = false ;switch (event.getAction()){case MotionEvent.ACTION_DOWN:str = "ACTION_DOWN";break ;case MotionEvent.ACTION_MOVE:str = "ACTION_MOVE";break;case MotionEvent.ACTION_UP:str = "ACTION_UP";break;}Log.v("zgy","=====View=====onTouchEvent========"+str) ;return super.onTouchEvent(event);} }
記得別忘記修改 xml 中的內(nèi)容

<com.gyzhong.eventdemo.EventLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:layout_gravity="center_horizontal" ><com.gyzhong.eventdemo.EventButtonandroid:layout_width="120dp"android:layout_height="60dp"android:gravity="center"android:text="eventButton"/> </com.gyzhong.eventdemo.EventLayout> 再次運(yùn)行代碼,果然,結(jié)果不一樣

=====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====onInterceptTouchEvent========ACTION_MOVE =====View=====dispatchTouchEvent========ACTION_MOVE =====View=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====onInterceptTouchEvent========ACTION_MOVE =====View=====dispatchTouchEvent========ACTION_MOVE =====View=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====ViewGroup=====dispatchTouchEvent========ACTION_UP =====ViewGroup=====onInterceptTouchEvent========ACTION_UP =====View=====dispatchTouchEvent========ACTION_UP =====View=====onTouchEvent========ACTION_UP
我們根據(jù)調(diào)試結(jié)果再加上流程圖不難推測(cè)出,在 View 的 onTouchEvent 的事件處理機(jī)制中把事件消費(fèi)掉了,并且在 action 為 ACTION_DOWN、ACTION_MOVE、ACTION_UP 的時(shí)候全部消費(fèi)掉了,所以不會(huì)再往下執(zhí)行,那我們就來(lái)看看源碼是否如此。?
進(jìn)入到 View 的onTouchEvent方法中

public boolean onTouchEvent(MotionEvent event) {//省略部分代碼if (((viewFlags & CLICKABLE) == CLICKABLE ||(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {}//省略很多代碼return true;}return false; }

以上代碼,我把有用的幾行提取出來(lái)了,可以看到,有一個(gè)判斷條件,如果 View 是可以點(diǎn)擊的狀態(tài),return true 事件將會(huì)被消費(fèi)掉,否則 return false 不會(huì)被消費(fèi)掉。而我們都知道 TextView 默認(rèn)狀態(tài)是不可點(diǎn)擊的, Button 是可以點(diǎn)擊的,所以這也就是為什么 TextView 和 Button 的調(diào)試效果不一樣,如果把 Button 設(shè)為不可點(diǎn)擊,效果就和 TextView 的完全一樣,有興趣的同學(xué)可以自己嘗試一下。

四、總結(jié)?
講了那么多,其實(shí)核心就是那張圖片,只要掌握了那張圖片中事件的流程基本上就沒(méi)什么問(wèn)題了;?
這張圖反應(yīng)出來(lái)的信息有:

1、Android 事件傳遞是層級(jí)傳遞的;?
2、dispatchTouchEvent從低級(jí)向上級(jí)傳遞,而onTouchEvent剛好相反;?
3、onInterceptTouchEvent返回為 true 時(shí),將執(zhí)行同級(jí)的onTouchEvent,而dispatchTouchEvent和onTouchEvent返回 true 時(shí),將終止事件的傳遞。

還有一點(diǎn)特別重要,也是比較難理解的一點(diǎn),就是我前面說(shuō)的那個(gè)結(jié)論。

ViewGroup 和 View的dispatchTouchEvent分發(fā)事件在 action 為ACTION_DOWN時(shí)沒(méi)有被攔截且onTouchEvent的處理事件在 action 為ACTION_DOWN時(shí)未被消費(fèi),當(dāng) action 為ACTION_MOVE或ACTION_UP時(shí),dispatchTouchEvent和onTouchEvent只有在 activity 被調(diào)用。

最后我將在下篇 blog 中,通過(guò)自定義通用型的下拉刷新來(lái)實(shí)戰(zhàn)事件處理機(jī)制,如果有興趣的同學(xué),可以關(guān)注。

這里附上一張 時(shí)序圖和log 信息?


Activity dispatchTouchEvent——->Action == ACTION_DOWN return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UPActivity dispatchTouchEvent——->Action == ACTION_MOVE return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UPActivity dispatchTouchEvent——->Action == ACTION_UP return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====ViewGroup=====onTouchEvent========ACTION_DOWN =====Activity=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UPViewGroup dispatchTouchEvent——->Action == ACTION_DOWN return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====onTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====onTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====onTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====ViewGroup=====dispatchTouchEvent========ACTION_UP =====ViewGroup=====onTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UPViewGroup dispatchTouchEvent——->Action == ACTION_MOVE return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====ViewGroup=====onTouchEvent========ACTION_DOWN =====Activity=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UPViewGroup dispatchTouchEvent——->Action == ACTION_UP return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====ViewGroup=====onTouchEvent========ACTION_DOWN =====Activity=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UPViewGroup onInterceptTouchEvent——->Action == ACTION_DOWN return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====ViewGroup=====onTouchEvent========ACTION_DOWN =====Activity=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UPView dispatchTouchEvent——->Action == ACTION_DOWN return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====onInterceptTouchEvent========ACTION_MOVE =====View=====dispatchTouchEvent========ACTION_MOVE =====View=====onTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====ViewGroup=====dispatchTouchEvent========ACTION_UP =====ViewGroup=====onInterceptTouchEvent========ACTION_UP =====View=====dispatchTouchEvent========ACTION_UP =====View=====onTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UPView dispatchTouchEvent——->Action == ACTION_MOVE return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====ViewGroup=====onTouchEvent========ACTION_DOWN =====Activity=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UPView dispatchTouchEvent——->Action == ACTION_UP return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====ViewGroup=====onTouchEvent========ACTION_DOWN =====Activity=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UPView onTouchEvent ——->Action == ACTION_DOWN return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====onInterceptTouchEvent========ACTION_MOVE =====View=====dispatchTouchEvent========ACTION_MOVE =====View=====onTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====ViewGroup=====dispatchTouchEvent========ACTION_UP =====ViewGroup=====onInterceptTouchEvent========ACTION_UP =====View=====dispatchTouchEvent========ACTION_UP =====View=====onTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UPView onTouchEvent ——->Action == ACTION_MOVE return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====ViewGroup=====onTouchEvent========ACTION_DOWN =====Activity=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UPView onTouchEvent ——->Action == ACTION_UP return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====ViewGroup=====onTouchEvent========ACTION_DOWN =====Activity=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UPViewGroup onTouchEvent ——->Action == ACTION_DOWN return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====dispatchTouchEvent========ACTION_MOVE =====ViewGroup=====onTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====ViewGroup=====dispatchTouchEvent========ACTION_UP =====ViewGroup=====onTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UPViewGroup onTouchEvent ——->Action == ACTION_MOVE return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====ViewGroup=====onTouchEvent========ACTION_DOWN =====Activity=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UPViewGroup onTouchEvent ——->Action == ACTION_UP return true =====Activity=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====dispatchTouchEvent========ACTION_DOWN =====ViewGroup=====onInterceptTouchEvent========ACTION_DOWN =====View=====dispatchTouchEvent========ACTION_DOWN =====View=====onTouchEvent========ACTION_DOWN =====ViewGroup=====onTouchEvent========ACTION_DOWN =====Activity=====onTouchEvent========ACTION_DOWN =====Activity=====dispatchTouchEvent========ACTION_MOVE =====Activity=====onTouchEvent========ACTION_MOVE =====Activity=====dispatchTouchEvent========ACTION_UP =====Activity=====onTouchEvent========ACTION_UP源碼下載: 源碼

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Android之事件处理全面剖析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。