Android事件分發(fā)

前幾天面試,面試官問了我一個(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容