3 回答

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊
最好的解密方法是源代碼。該文檔不足以解釋這一點(diǎn)。
dispatchTouchEvent實(shí)際上是在Activity,View和ViewGroup上定義的。將其視為決定如何路由觸摸事件的控制器。
例如,最簡(jiǎn)單的情況是View.dispatchTouchEvent,它將觸摸事件路由到OnTouchListener.onTouch(如果已定義)或擴(kuò)展方法onTouchEvent。
對(duì)于ViewGroup.dispatchTouchEvent,事情要復(fù)雜得多。它需要確定其子視圖中的哪個(gè)應(yīng)獲取事件(通過(guò)調(diào)用child.dispatchTouchEvent)。這基本上是一種命中測(cè)試算法,您可以確定哪個(gè)子視圖的邊界矩形包含接觸點(diǎn)坐標(biāo)。
但是在將事件分派到適當(dāng)?shù)淖右晥D之前,父級(jí)可以一起監(jiān)視和/或攔截事件。這就是onInterceptTouchEvent的用途。因此,它會(huì)在進(jìn)行點(diǎn)擊測(cè)試之前先調(diào)用此方法,如果事件被劫持(通過(guò)從onInterceptTouchEvent返回true),則會(huì)向子視圖發(fā)送ACTION_CANCEL,以便他們可以放棄對(duì)觸摸事件的處理(從先前的觸摸事件開(kāi)始),然后再取消父級(jí)的所有觸摸事件都將分派到onTouchListener.onTouch(如果已定義)或onTouchEvent()。同樣在這種情況下,永遠(yuǎn)不會(huì)再次調(diào)用onInterceptTouchEvent。
您甚至要覆蓋[Activity | ViewGroup | View] .dispatchTouchEvent嗎?除非您正在執(zhí)行一些自定義路由,否則您可能不應(yīng)該這樣做。
如果要在父級(jí)監(jiān)視和/或攔截觸摸事件,則主要擴(kuò)展方法是ViewGroup.onInterceptTouchEvent,并使用View.onTouchListener / View.onTouchEvent進(jìn)行主事件處理。
總而言之,它的設(shè)計(jì)imo過(guò)于復(fù)雜,但android API更傾向于靈活性而不是簡(jiǎn)單性。
添加回答
舉報(bào)