溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android事件傳遞

發(fā)布時間:2020-08-04 09:05:37 來源:網(wǎng)絡(luò) 閱讀:992 作者:chainli 欄目:移動開發(fā)

Android事件傳遞


更多請關(guān)注 MemoMind


事件經(jīng)過主要的三層,分別是Activity、Layout(多個)、View


三者都擁有dispatchTouchEvent和onTouchEvent方法。

dispatchTouchEvent是用來控制事件分發(fā)的(隧道方式傳遞)。從源碼的角度看,其邏輯控制等起主導(dǎo)作用;從使用角度看,在diapatchTouchEvent中用邏輯判斷、設(shè)置Event的action是個好的方法,而改變其return值會讓事件丟失。

onTouchEvent是用來處理、消費事件的。return true標志著事件已被消費;return false標志著事件未被消費,往Layout/Activity方向傳遞。


Layout除了擁有這兩個方法,還獨有onInterceptTouchEvent方法。

onInterceptTouchEvent是在事件由Layout分發(fā)到View之前的一個攔截機制。因為只通過Layout的dispatchTouchEvent操控只能讓事件丟失。

如果onInterceptTouchEvent return true,表明攔截事件,事件就不會繼續(xù)分發(fā)而是跳到Layout的onTouchEvent方法中去處理;return false則事件繼續(xù)分發(fā)。


在眾多分析事件機制的文章中,很難看到與onTouch、onClick關(guān)聯(lián)起來的解釋。開始時我也拿捏不好onTouch和onTouchEvent的關(guān)系。

事實上,onTouch是在onTouchEvent之前執(zhí)行的。如果onTouch return true,表示事件已經(jīng)被消費,不會調(diào)用onTouchEvent了。

而onClick呢,則是在onTouchEvent的ACTION_DOWN和ACTION_UP都執(zhí)行完之后,才會觸發(fā)onClick。也就是說,在此之前任意位置return了true,onClick都不會被調(diào)用。


至此,我產(chǎn)生了一個疑問:Android為什么要這么設(shè)計事件傳遞機制?

① onInterceptTouchEvent:是Layout特有的,是給予Layout對于Event的獨立把控權(quán),而不是傻傻的等待事件再冒泡傳遞回onTouchEvent。

② onTouch:區(qū)分于onTouchEvent,給開發(fā)者不破壞基礎(chǔ)事件傳遞邏輯(比如 Button的onTouchEvent默認的Super.onTouchEvent()里面是有邏輯判斷來決定return值)的情況下對事件有自己的把控操縱權(quán)。



向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI