一届腐、事件分發(fā)機(jī)制流程
(1)Activity的事件分發(fā)
- Activity.dispatchTouchEvent()方法,內(nèi)部調(diào)用getWindow.superDispatchTouchEvent()方法酣溃。
- 因?yàn)閃indow是抽象方法,所以調(diào)用子類PhoneWindows.superDispatchTouchEvent()方法,內(nèi)部調(diào)用
mDecor.superDispatchTouchEvent()方法。 - DecorView繼承于FrameLayout作為頂層View汉买,是所有界面的父類。而FrameLayout作為ViewGroup的子類佩脊,所以直接調(diào)用了ViewGroup的dispatchTouchEvent()蛙粘。
- ViewGroup.dispatchTouchEvent()
true:Activity.dispatchTouchEvent()返回為true
false:Activity.onTouchEvent()
super:將事件傳遞到ViewGroup.onInterceptTouchEvent()
(2)ViewGroup的事件分發(fā)
- ViewGroup.dispatchTouchEvent()調(diào)用ViewGroup.onInterceptTouchEvent()方法攔截事件。
- ViewGroup.onInterceptTouchEvent()默認(rèn)不攔截向下傳遞威彰,攔截需要手動(dòng)復(fù)寫設(shè)置出牧。
true:攔截事件不允許事件繼續(xù)向子View傳遞,調(diào)用ViewGroup.dispatchTouchEvent()自己處理事件:onTouch → onTouchEvent → onClick歇盼。
false:不攔截允許事件繼續(xù)向子View傳遞舔痕,遍歷ViewGroup中所有子View,找到被點(diǎn)擊的子View豹缀,調(diào)用子View的dispatchTouchEvent()方法伯复。
super:不攔截允許事件繼續(xù)向子View傳遞,遍歷ViewGroup中所有子View邢笙,找到被點(diǎn)擊的子View啸如,調(diào)用子View的dispatchTouchEvent()方法。
(3)View的事件分發(fā)
- View.dispatchTouchEvent()方法調(diào)用View.onTouch方法判斷是否消費(fèi)事件氮惯。返回true事件被消費(fèi)叮雳,dispatchTouchEvent()方法返回true想暗;返回false事件沒(méi)有被消費(fèi)繼續(xù)向下傳遞,dispatchTouchEvent()調(diào)用View.onTouchEvent方法债鸡。
- onTouchEvent()判斷當(dāng)前點(diǎn)擊和長(zhǎng)按點(diǎn)擊有一個(gè)為true江滨,onTouchEvent()就返回為true消費(fèi)掉當(dāng)前事件;false將事件傳給ViewGroup.onTouchEvent()方法厌均;
- mOnClickListener不為空唬滑,調(diào)用onClick方法。
(4)事件分發(fā)工作流程
- Activity.dispatchTouchEvent()
true:消費(fèi)
false:Activity.onTouchEvent()
super:ViewGroup.dispatchTouchEvent() - ViewGroup.dispatchTouchEvent()
true:消費(fèi)
false:Activity.onTouchEvent()
super:ViewGroup.onInterceptTouchEvent() - ViewGroup.onInterceptTouchEvent()
true:ViewGroup.onTouchEvent()
false:View.dispatchTouchEvent()
super:View.dispatchTouchEvent() - View.dispatchTouchEvent()
true:消費(fèi)
false:ViewGroup.onTouchEvent()
super:View.onTouchEvent() - View.onTouchEvent()
true:消費(fèi)
false:ViewGroup.onTouchEvent()
super:View.onTouchEvent() - ViewGroup.onTouchEvent()
true:消費(fèi)
false:Activity.onTouchEvent()
super:Activity.onTouchEvent() - Activity.onTouchEvent()
true:無(wú)處理結(jié)束
false:無(wú)處理結(jié)束
super:無(wú)處理結(jié)束