整理一:
1.在子 Viewgroup 中如果 dispatchTouchEvent 返回了 true ,不调用 super.dispatch ,那么事件就会在dispatchTransformed 中进行返回 true ,就会不会执行到后续的onInterceptEvent,但是会记录 view 的下标,以及信息,并对newTouchTarget进行赋值操作。如果返回了 false 那么就不会记录 view 信息,
2、如果在 intercept 中返回了 true 会执行dispatchTransformed方法,然后回到 super.dispatchTouchEvent 方法,(也就是 View.dispatchTouchEvent 方法)。然后再 view.dispatchTouchEvent方法中调用 该 view 的onTouchevent 方法进行事件消费处理。
3.在View.dispatchTouchEvent 方法中,会首先判断 onTouch事件监听,如果 onTouch 事件返回了 true 那么事件将不会向下传递。也就是 该 view 的onTouchEvent不会响应。也就是点击事件和长点击事件不会相应。
4.点击事件开始在没有消费前,是一层一层向下传递的。在最底层 view.onTouchEvent 返回 false 时,事件会回调 到上一层的 onTouchEvent 方法。依次类推。(责任链模式)
5.在自定义 viewGroup 中返回 false 和返回 super.dispatchTouchEvent 的区别:如果直接返回 false 属于事件不进行处理,交给上级 view 的 onTouchEvent 方法,如果返回 super 的话就会回到父容器的disPatchTouchEvent方法(一般是 ViewGroup 的)。在该方法内部会判断 onIntercept 方法,然后进行执行后续的触摸事件逻辑。
6.如果子view 消费了 Down事件,那么后续 的 move 事件也由该 view相应。在父级别的onInterceptEvent 方法也可以监听到 move,up 事件,如果需要拦截也可以在该方法中对事件进行拦截;(这也对应了在滚动冲突时,通过在父容器中进行移动事件的处理。来解决滚动冲突);但是如果在 子view 中消费了全部的事件。那么父容器将无法进行消费。(事件只能被一个 view 所消费,类似于网络流,只能被其中一个拦截器所消费。)
7.由于长点击事件是在 down 中进行开始的任务,因此想要拦截 子 view 的长点击事件。那么就需要在父容器中由父容器响应down 事件。但是如果父容器相应了 down 事件,那么子view 将无法进行滚动等其他操作。全部事件将由父容器消费。因此针对长点击事件的拦截 1.进行全部事件的整体拦截。2.在长点击响应前移除全部 子View的长点击。或者遍历取消 子 view的长点击能力。
整理二
1.一个事件序列从手指接触屏幕到手指离开屏幕,在这个过程中产生一系列事件,以Down 事件开始,中间含有不定数的 Move 事件,以 up事件结束。
2.正常情况下,一个事件序列只能被一个 view 拦截并且消耗。
3.某个 ViewGroup 一旦决定在onInterceptTouchEvent 中拦截,那么这个事件序列都将由它的 onTouchEvent 处理,并且它的 onInterceptTouchEvent 不会再调用。
4.某个 View 一旦开始处理事件,如果它不消耗 Down 事件,那么同一事件序列的其他事件都不会再交给它进行处理,并重新交给它的父容器处理。父容器的 onTouchEvent被调用。
5.事件的传递过程是由外向内的,事件总是先传递给父元素,然后由父元素分发给子 View,通过requestdisallowInterceptTouchEvent 方法可以在子 view 中干预父元素的事件分发过程,但是 Down 事件除外。(只能干预 onInterceptTouchEvent 方法)
6.ViewGroup 默认不拦截任何事件,onInterceptTouchEvent默认返回 false,View没有onInterceptTouchEvent 方法,一旦有点击事件传递给它,那么它的onTouchEvent方法就会被调用。
7.View 的 onTouchEvent 默认会消耗事件(返回 true),除非它是不可点击的。(clickAble,LongClickAble 同时为 false),View 的LongClickable默认都是 false,clickable 根据view 不同而不同,button 的clickable 是true。
8.View 的enable 属性不影响onTouchEvent 的默认返回值。哪怕一个 view 是 disable 状态,只要clickable 或longclickable 只要有一个为 true,那么这个 view 的 onTouchEvent 就会返回true。
9.view 的onClick 事件是在 onTouchEvent 中接受到Down 事件,然后再Up 事件中进行相应。onLongClick 事件是在 Down 事件中设置了 handle 的延迟任务,时间到了。就会触发长点击回调。