1.手勢傳遞一般過程
Android 手勢傳遞通過dispatchTouchEvent 、onInterceptTouchEvent(ViewGroup特有)、onTouchEvent
View手勢過程傳遞為dispatchTouchEvent ----》》onInterceptTouchEvent ----》》onTouchEvent
多嵌套手勢傳遞過程為如圖所示 ParentView 包含 SonView 包含 ChildView
手勢傳遞過程由最外層 父view 往最內層 子View 傳遞,view內部執行攔截檢驗 dispatch 和 intercept,返回false(不攔截處理)的時候,view繼續將手勢往下傳遞,直到到達最內層子view后,由子view執行onTouch事件,如果子view不做處理返回false,則向上級父類傳遞,執行父類onTouch事件。
2.手勢 攔截處理
2.1 Android 基礎手勢為 ACTION_DOWN , ACTION_MOVE, ACTION_UP
ANCTION_MOVE,ACTION_UP以ACTION_DOWN是否做處理而出現,即攔截ACTION_DOWN后,才依次出現ACTION_MOVE,ACTION_UP.
2.2 onInterceptTouchEvent 攔截處理對象為View, dispatchTouchEvent和onTouchEvent 則面對傳遞過程。
onInterceptTouchEvent ACTION_DOWN 返回true,手勢不會向ChildView傳遞,而是執行son的onTouch事件,然后繼續向上級傳遞。
dispatchTouchEvent ACTION_DOWN 返回true,因為dispatch是對過程進行攔截,并且告訴系統,此處需要進行手勢處理,不需要再進行手勢傳遞,所以,系統直接進行下個手勢的傳遞。同理 onTouchEvent 也是如此
前面說過,手勢的傳遞開始于ACTION_DOWN,當系統接收到手勢攔截的反饋之后,才會將ACTIOIN_MOVE,ACTION_UP傳遞出來,并且確認攔截的當前View中的onInterceptTouchEvent 不再執行。
所以,個人覺得,做手勢攔截和解決手勢沖突問題,要明確手勢傳遞的過程還有其本身處理規則,我認為做攔截,先是在Intercept處確定攔截規則,在把具體實現放在touch中。