1.事件響應(yīng)機(jī)制的預(yù)備知識
在深入了解Android事件響應(yīng)機(jī)制前石咬,一些預(yù)備知識我們應(yīng)該有所了解。
1.1 onTouch是優(yōu)先于onClick執(zhí)行嫉嘀,事件傳遞的順序是先經(jīng)過onTouch泉沾,再傳遞到onClick。
1.2 Android中的事件onClick鞍盗、onLongClick需了、onScroll等跳昼,都是由多個Touch事件(一個ACTION_DOWN,多個ACTION_MOVE,一個ACTION_UP)組成。
1.3 Android事件響應(yīng)機(jī)制是“由外到內(nèi)”分發(fā)肋乍、“由內(nèi)到外”處理的形式實現(xiàn)的鹅颊。
1.4 MotionEvent對象的四種狀態(tài)
MotionEvent.ACTION_DOWN:手指按下屏幕的瞬間。
MotionEvent.ACTION_MOVE:手指在屏幕上移動
MotionEvent.ACTION_UP:手指離開屏幕瞬間
MotionEvent.ACTION_CANCEL:取消手勢
2.Android事件處理的三個重要函數(shù)
Android事件分發(fā)機(jī)制主要由“事件分發(fā)”—>“事件攔截”—>“事件響應(yīng)”這三步來進(jìn)行邏輯控制的墓造。本文也將從這三步對應(yīng)的函數(shù)來分析堪伍。
2.1 事件分發(fā):public boolean dispatchTouchEvent(MotionEvent ev)
當(dāng)監(jiān)聽到有觸發(fā)事件時,首先由Activity進(jìn)行捕獲觅闽,然后事件就進(jìn)入事件分發(fā)的流程帝雇。Activity本身沒有事件攔截,從而將事件傳遞給最外層的View的dispatchTouchEvent(MotionEvent ev)方法蛉拙,該方法將對事件進(jìn)行分發(fā)尸闸。
return true : View消費所有事件。
return false :停止分發(fā)孕锄,交由上層控件的onTouchEvent方法進(jìn)行消費吮廉,如果本層控件是Activity,那么事件將被系統(tǒng)消費畸肆、處理宦芦。
super.dispatchTouchEvent(ev): 將事件交由本層的事件攔截onInterceptTouchEvent方法處理。
2.2 事件攔截:public boolean onInterceptTouchEvent(MotionEvent ev)
return true: 對事件攔截轴脐,交由本層的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處理完事件后消費了此次事件舀患。
return false: 不響應(yīng)事件徽级,不斷的傳遞給上層的onTouchEvent方法處理,直到某個View的onTouchEvent返回true聊浅,則認(rèn)為該事件被消費餐抢。如果到最頂層View還是返回false,那么該事件不消費低匙,將交由Activity的onTouchEvent進(jìn)行處理旷痕。
return: super.onTouchEvent,不響應(yīng)事件,結(jié)果與return返回false一樣顽冶。
總結(jié)一哈:
ViewGroup默認(rèn)不攔截任何事件。
點擊事件的分發(fā)過程如下:dispatchTouchEvent—>onTouchListener的OnTouch方法—>onTouchEvent—>onClickListener的onClick方法强重。從而也可以看出onTouch優(yōu)先于onClick執(zhí)行绞呈。
子View可以通過使用getParent().requestDisallowInterceptTouchEvent(true),阻止ViewGroup對其MOVE或UP事件進(jìn)行攔截。
一個點擊事件產(chǎn)生后佃声,傳遞過程是:Activity—>Window—>View艺智。頂級View接受到事件后圾亏,就會按照上面的規(guī)則去分發(fā)事件。
好了志鹃,本文到此結(jié)束。以上僅是個人對Android事件分發(fā)機(jī)制的粗略理解弄跌,如有不足之處甲喝,還望指正。如果大家想進(jìn)一步