本篇文章主要講述ViewGroup中關于觸摸事件傳遞的相關邏輯。主要梳理一下dispatchTouchEvent
函數(shù)。
一些知識點
-
FLAG_DISALLOW_INTERCEPT
膜蠢,可以使用requestDisallowInterceptTouchEvent
來設置ViewGroup
的這個標記位,讓ViewGroup不攔截事件岖食。 -
ViewGroup
只會將觸摸事件轉(zhuǎn)發(fā)給那些可見并且觸摸事件發(fā)生在其可視范圍內(nèi)的子View
- 如果一個子
View
沒有接收ACTION_DOWN
事件,那么這個事件系列的ACTION_MOVE
或者ACTION_UP
事件根本不會傳遞給它 - 關于
ViewGroup
攔截與否消費與否的判斷哑姚,只要記住一點就可以輕易判斷:1ViewGroup
是否最終沒有消費觸摸事件(無論是自己自己消費寺鸥,還是分發(fā)給子view消費)涯呻,決定之后的觸摸事件是否會再轉(zhuǎn)發(fā)給它咳短。
dispatchTouchEvent的主流程
dispatchTouchEvent中遍歷child分發(fā)事件的邏輯
轉(zhuǎn)換觸摸事件并分發(fā)的過程-dispatchTransformedTouchEvent
更詳細的源代碼請查看我的github