前幾天面試,面試官問了我一個(gè)問題如圖:

圖.png
當(dāng)時(shí)我就懵了,應(yīng)為我從來沒有看過這方面的東西,哎!面試吃了虧,下來就下功夫了,這不我為了不讓下一個(gè)面試官感到尷尬我要測(cè)底理解透了它........
Activity---dispatchTouchEvent(默認(rèn))----分發(fā)下一級(jí)
LinearLayout---dispatchTouchEvent(默認(rèn))----分發(fā)下一級(jí) and LinearLayout---onInterceptTouchEvent(默認(rèn))----下一級(jí)處理
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),同時(shí)事件會(huì)停止繼續(xù)傳遞;
- View|ViewGroup.dispatchTouchEvent 返回false, 事件有傳遞給 上一層的(可能是ViewGroup或者Activity) onTouchEvent進(jìn)行處理
- View.dispatchTouchEvent 返回super.dispatchTouchEvent(ev); 事件會(huì)傳遞給當(dāng)前View的 onTouchEvent 進(jìn)行處理;
- ViewGroup.dispatchTouchEvent 返回super.dispatchTouchEvent(ev); 事件會(huì)傳遞給當(dāng)前ViewGroup的 onInterceptTouchEvent 進(jìn)行處理;
事件攔截 onInterceptTouchEvent
onInterceptTouchEvent 的事件攔截邏輯如下:
- 如果 onInterceptTouchEvent 返回 true,則表示將事件會(huì)被攔截,事件最終在當(dāng)前ViewGroup的 onTouchEvent 進(jìn)行處理;
- 如果 onInterceptTouchEvent 返回 false,則表示將事件沒被攔截,事件會(huì)被傳遞到子 View上,再由子 View 的 dispatchTouchEvent來開始這個(gè)事件的分發(fā);
- 如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默認(rèn)不會(huì)被攔截,處理方式同返回false一樣。
事件響應(yīng) onTouchEvent
onTouchEvent 的事件響應(yīng)邏輯如下:
- 如果 onTouchEvent返回了 true 則會(huì)接收并消費(fèi)該事件。
- 如果 onTouchEvent返回了 false 那么這個(gè)事件會(huì)從當(dāng)前 View 向上傳遞,并且都是由上層 View 的 onTouchEvent 來接收,
如果傳遞到上面的 onTouchEvent 也返回 false,這個(gè)事件就會(huì)“消失”,而且接收不到下一次事件。
- 如果返回 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