一、Touch 事件分析:
事件分發(fā):dispatchTouchEvent
return true:事件會分發(fā)給當(dāng)前 View 并由 dispatchTouchEvent 方法進(jìn)行消費(fèi),同時(shí)事件停止向下傳遞专执;
return false:返回給 上一級的onTouchEvent 進(jìn)行消費(fèi)少孝;
return super.dispatchTouchEvent(ev):事件會自動的分發(fā)給當(dāng)前 View 的 onInterceptTouchEvent 方法。
事件攔截:onInterceptTouchEvent
(在View 的 dispatchTouchEvent(MotionEvent ev) 返回super.dispatchTouchEvent(ev) 時(shí)陈辱,事件會自動分發(fā)給當(dāng)前 View 的 onInterceptTouchEvent 方法)
return true:將事件進(jìn)行攔截丰滑,并將攔截到的事件交由當(dāng)前 View 的 onTouchEvent 進(jìn)行處理;
return false:將事件放行腺劣,當(dāng)前 View 上的事件會被傳遞到子 View 上绿贞,再由子 View 的 dispatchTouchEvent 來開始這個(gè)事件的分發(fā);
return super.onInterceptTouchEvent(ev):事件默認(rèn)會被攔截橘原,并將攔截到的事件交由當(dāng)前 View 的 onTouchEvent 進(jìn)行處理籍铁。
事件響應(yīng):onTouchEvent
(在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 并且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 時(shí)onTouchEvent 會被調(diào)用)
return? false:事件從當(dāng)前 View 向上傳遞,并且都是由上層 View 的onTouchEvent 來接收趾断,如果傳遞到上面的 onTouchEvent 也返回
false拒名,這個(gè)事件就會“消失”,而且接收不到下一次事件芋酌。
return true:則會接收并消費(fèi)該事件增显。
return super.onTouchEvent(ev): 默認(rèn)處理事件的邏輯和返回 false 時(shí)相同。
1.ViewGroup的dispatchTouchEvent為false:
結(jié)果分析:
事件先由Activity的dispatchTouchEvent 分發(fā)給 ViewGroup的dispatchTouchEvent脐帝,而ViewGroup的 dispatchTouchEvent 返回 false同云,表示對獲取到的事件停止向下傳遞,同時(shí)也不對該事件進(jìn)行消費(fèi)堵腹。由于 ViewGroup獲取的事件直接來自 Activity炸站,則會將事件返回給 Activity的 onTouchEvent 進(jìn)行消費(fèi),最后直接由 Activity來響應(yīng)手指移動和抬起事件疚顷。
2.ViewGroup的dispatchTouchEvent為true:
結(jié)果分析:
事件由Activity的dispatchTouchEvent 分發(fā)給 ViewGroup的dispatchTouchEvent旱易,而ViewGroup的 dispatchTouchEvent 返回 true,表示分發(fā)事件到ViewGroup并由ViewGroup的dispatchTouchEvent 進(jìn)行消費(fèi)腿堤。Activity 不斷的分發(fā)事件到ViewGroup控件的dispatchTouchEvent阀坏,而ViewGroup控件的dispatchTouchEvent也不斷的將獲取到的事件進(jìn)行消費(fèi)。
3.ViewGroup的onInterceptTouchEvent為true:
結(jié)果分析:
事件由Activity的dispatchTouchEvent方法分發(fā)給ViewGroup控件的dispatchTouchEvent释液,而ViewGroup的 dispatchTouchEvent 返回super.dispatchTouchEvent(ev)全释,表示對事件進(jìn)行分發(fā)并向下傳遞給 ViewGroup控件的onInterceptTouchEvent 方法,該方法返回 true 表示對所獲取到的事件進(jìn)行攔截并將事件傳遞給ViewGroup的onTouchEvent 進(jìn)行處理误债,ViewGroup的 onTouchEvent返回 super.onTouchEvent(ev) 表示對事件沒有做任何處理直接將事件返回給上級浸船,由于 ViewGroup獲取的事件直接來自Activity,所以 ViewGroup的 onTouchEvent會將事件以冒泡方式直接返回給 Activity的 onTouchEvent 進(jìn)行消費(fèi)寝蹈,后續(xù)的事件則會跳過ViewGroup直接由 Activity的 onTouchEvent 消費(fèi)來自Activity自身分發(fā)的事件李命。
4.ViewGroup的onInterceptTouchEvent為false:
ViewGroup的onInterceptTouchEvent為false
結(jié)果分析:
事件先由Activity 的 dispatchTouchEvent 方法分發(fā)給 ViewGroup的 dispatchTouchEvent,而ViewGroup的 dispatchTouchEvent 返回super.dispatchTouchEvent(ev)箫老,表示對事件進(jìn)行分發(fā)并向下傳遞給ViewGroup的 onInterceptTouchEvent 方法封字,該方法返回 false 表示事件會被放行并傳遞到View 的dispatchTouchEvent方法,同樣View的 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev),認(rèn)會將事件傳遞給 View的 onTouchEvent 進(jìn)行處理阔籽,View的 onTouchEvent 返回 super.onTouchEvent(ev)表示對事件沒有做任何處理直接將事件返回給上級流妻,由于 View獲取的事件直接來自ViewGroup,所以View的 onTouchEvent會將事件以冒泡方式直接返回給 ViewGroup
的 onTouchEvent 進(jìn)行消費(fèi)笆制,而 ViewGroup的 onTouchEvent 也返回了super.onTouchEvent(ev)绅这,同樣 ViewGroup的 onTouchEvent 也會將事件返回給上級,而TouchEventFather 獲取的事件直接來自Activity在辆,所以 ViewGroup控件的onTouchEvent 會將事件以冒泡方式直接返回給 Activity 的 onTouchEvent進(jìn)行消費(fèi)证薇,后續(xù)的事件則會跳過 ViewGroup和 View,直接由Activity 的 onTouchEvent 消費(fèi)來自Activity 自身分發(fā)的事件。
5.ViewGroup的onInterceptTouchEvent為false匆篓,View的dispatchTouchEvent為true:
結(jié)果分析:
事件由Activity的dispatchTouchEvent 方法分發(fā)給ViewGroup的dispatchTouchEvent,ViewGroup的 dispatchTouchEvent 返回super.dispatchTouchEvent(ev)鸦概,事件會分發(fā)到ViewGroup的 onInterceptTouchEvent箩张,onInterceptTouchEvent 返回 false,表示放行當(dāng)前事件完残;事件會被傳遞到View 的 dispatchTouchEvent伏钠,dispatchTouchEvent 返回 true 表示事件被分發(fā)到 View并由View的dispatchTouchEvent 方法消費(fèi)横漏。后續(xù)的事件也會不斷的重復(fù)上面的邏輯最終被 View的dispatchTouchEvent 消費(fèi)谨设。