浅谈Android事件分发机制
在Android實(shí)際開發(fā)過程中經(jīng)常會(huì)遇到View之間的滑動(dòng)沖突,如ScrollView與Listview、RecyclerView之間的嵌套使用。在很好的解決此類問題之前,我們應(yīng)深入的了解Android事件響應(yīng)機(jī)制。
1.事件響應(yīng)機(jī)制的預(yù)備知識(shí)
在深入了解Android事件響應(yīng)機(jī)制前,一些預(yù)備知識(shí)我們應(yīng)該有所了解。
1.1 onTouch是優(yōu)先于onClick執(zhí)行,事件傳遞的順序是先經(jīng)過onTouch,再傳遞到onClick。
1.2 Android中的事件onClick、onLongClick、onScroll等,都是由多個(gè)Touch事件(一個(gè)ACTION_DOWN,多個(gè)ACTION_MOVE,一個(gè)ACTION_UP)組成。
1.3 Android事件響應(yīng)機(jī)制是“由外到內(nèi)”分發(fā)、“由內(nèi)到外”處理的形式實(shí)現(xiàn)的。
1.4 MotionEvent對(duì)象的四種狀態(tài)
MotionEvent.ACTION_DOWN:手指按下屏幕的瞬間。
MotionEvent.ACTION_MOVE:手指在屏幕上移動(dòng)
MotionEvent.ACTION_UP:手指離開屏幕瞬間
MotionEvent.ACTION_CANCEL:取消手勢(shì)
2.Android事件處理的三個(gè)重要函數(shù)
Android事件分發(fā)機(jī)制主要由“事件分發(fā)”—>“事件攔截”—>“事件響應(yīng)”這三步來進(jìn)行邏輯控制的。本文也將從這三步對(duì)應(yīng)的函數(shù)來分析。
2.1 事件分發(fā):public boolean dispatchTouchEvent(MotionEvent ev)
當(dāng)監(jiān)聽到有觸發(fā)事件時(shí),首先由Activity進(jìn)行捕獲,然后事件就進(jìn)入事件分發(fā)的流程。Activity本身沒有事件攔截,從而將事件傳遞給最外層的View的dispatchTouchEvent(MotionEvent ev)方法,該方法將對(duì)事件進(jìn)行分發(fā)。
- return true : View消費(fèi)所有事件。
- return false :停止分發(fā),交由上層控件的onTouchEvent方法進(jìn)行消費(fèi),如果本層控件是Activity,那么事件將被系統(tǒng)消費(fèi)、處理。
- super.dispatchTouchEvent(ev): 將事件交由本層的事件攔截onInterceptTouchEvent方法處理。
2.2 事件攔截:public boolean onInterceptTouchEvent(MotionEvent ev)
- return true: 對(duì)事件攔截,交由本層的onTouchEvent進(jìn)行處理。
- return false: 不攔截,分發(fā)到子View,由子View的dispatchTouchEvent方法處理。
- super.onInterceptTouchEvent(ev):默認(rèn)表示事件攔截,交由本層的onTouchEvent進(jìn)行處理。
2.3 事件響應(yīng):public boolean onTouchEvent(MotionEvent ev)
- return true: 表示onTouchEvent處理完事件后消費(fèi)了此次事件。
- return false: 不響應(yīng)事件,不斷的傳遞給上層的onTouchEvent方法處理,直到某個(gè)View的onTouchEvent返回true,則認(rèn)為該事件被消費(fèi)。如果到最頂層View還是返回false,那么該事件不消費(fèi),將交由Activity的onTouchEvent進(jìn)行處理。
- return: super.onTouchEvent,不響應(yīng)事件,結(jié)果與return返回false一樣。
綜上所述,我們可以總結(jié)出如下流程圖:
結(jié)合上面的理解,我們?cè)賮砜纯碩ouch事件傳遞機(jī)制流程圖
3. 總結(jié)
通過上面的敘述,相信大家對(duì)Android的分發(fā)機(jī)制有了初步的理解。為了加深大家的理解,下面做個(gè)簡(jiǎn)單的總結(jié)。
好了,本文到此結(jié)束。以上僅是個(gè)人對(duì)Android事件分發(fā)機(jī)制的粗略理解,如有不足之處,還望指正。如果大家想進(jìn)一步的結(jié)合源碼深入了解,建議大家可以再看看郭霖的這篇文章http://blog.csdn.net/guolin_blog/article/details/9097463/
總結(jié)
以上是生活随笔為你收集整理的浅谈Android事件分发机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android中实现SQLite数据库C
- 下一篇: 从源码角度解析Android中APK安装