1、核心方法
dispatchTouchEvent(MotionEvent ev) // 分发
onInterceptTouchEvent(MotionEvent ev) // 拦截
onTouchEvent(MotionEvent event) // 消费
requestDisallowInterceptTouchEvent // 是否允许父控件拦截,也算一个吧
2、直接从ViewGroup分发开始
事件 1个ACTIVO_DOWN N个ACTION_MOVE 1个ACTION_UP 或 ACTION_CANCER
所有事件序列都是从DOWN事件开始 ,故有DOWN事件时会初始化控件状态
3、决定当前控件是否拦截事件
4、DOWN事件时决定分发链
从最上端遍历查找目标view,是因为两个view有可能重叠,所以选择重叠控件的最上层开始判断
这个地方如果拦截标识为true,child == null 故执行View的事件分发(view的事件分发比较简单,不过很重要,看完后就会明白touch、longClick、onClick的执行顺序),如果不拦截且是ViewGroup就会继续分发,有没有感觉和责任链模式很像,这里如果所有子控件的onTouchEvent方法返回false就会执行下图,child == null 逻辑
如果MOVE事件到来,对拦截标识赋值后直接进入了
从上面两张图,如果MOVE的时候拦截,则子控件的事件类型会变成CANCEL,切从分发链中移除,后续子控件不在收到分发事件,事件的消费交给了原子控件的父控件处理
如果不拦截,最终消费事件的方法返回了false则直接交给了处理,如下图