前幾天面試现横,面試官問了我一個問題如圖:
圖.png
當(dāng)時我就懵了漓拾,應(yīng)為我從來沒有看過這方面的東西,哎长赞!面試吃了虧晦攒,下來就下功夫了闽撤,這不我為了不讓下一個面試官感到尷尬我要測底理解透了它........
Activity---dispatchTouchEvent(默認(rèn))----分發(fā)下一級
LinearLayout---dispatchTouchEvent(默認(rèn))----分發(fā)下一級 and LinearLayout---onInterceptTouchEvent(默認(rèn))----下一級處理
button---dispatchTouchEvent(默認(rèn))---自己onTouchEvent(默認(rèn))---處理事件
事件分發(fā) dispatchTouchEvent
dispatchTouchEvent 的事件分發(fā)邏輯如下:
- Activity.dispatchTouchEvent 返回 true |fasle 事件只在 Activity 的 dispatchTouchEvent 進(jìn)行處理得哆。
- View|ViewGroup.dispatchTouchEvent 返回true, 事件在當(dāng)前 View|ViewGroup 的 dispatchTouchEvent 方法進(jìn)行消費(fèi)哟旗,同時事件會停止繼續(xù)傳遞贩据;
- View|ViewGroup.dispatchTouchEvent 返回false, 事件有傳遞給 上一層的(可能是ViewGroup或者Activity) onTouchEvent進(jìn)行處理
- View.dispatchTouchEvent 返回super.dispatchTouchEvent(ev); 事件會傳遞給當(dāng)前View的 onTouchEvent 進(jìn)行處理闸餐;
- ViewGroup.dispatchTouchEvent 返回super.dispatchTouchEvent(ev); 事件會傳遞給當(dāng)前ViewGroup的 onInterceptTouchEvent 進(jìn)行處理饱亮;
事件攔截 onInterceptTouchEvent
onInterceptTouchEvent 的事件攔截邏輯如下:
- 如果 onInterceptTouchEvent 返回 true,則表示將事件會被攔截舍沙,事件最終在當(dāng)前ViewGroup的 onTouchEvent 進(jìn)行處理近上;
- 如果 onInterceptTouchEvent 返回 false,則表示將事件沒被攔截拂铡,事件會被傳遞到子 View上壹无,再由子 View 的 dispatchTouchEvent來開始這個事件的分發(fā)葱绒;
- 如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默認(rèn)不會被攔截斗锭,處理方式同返回false一樣地淀。
事件響應(yīng) onTouchEvent
onTouchEvent 的事件響應(yīng)邏輯如下:
- 如果 onTouchEvent返回了 true 則會接收并消費(fèi)該事件。
- 如果 onTouchEvent返回了 false 那么這個事件會從當(dāng)前 View 向上傳遞岖是,并且都是由上層 View 的 onTouchEvent 來接收帮毁,
如果傳遞到上面的 onTouchEvent 也返回 false,這個事件就會“消失”豺撑,而且接收不到下一次事件烈疚。
- 如果返回 super.onTouchEvent(ev);
Activity.super.onTouchEvent(ev); 默認(rèn) 返回 false
ViewGroup.super.onTouchEvent(ev); 默認(rèn) 返回 false
View.super.onTouchEvent(ev); 默認(rèn) 返回 true
總結(jié)表格
事件分發(fā).png