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中。
网友评论