当某个 view 一直在处理事件,如果事件流没有中断,但是后续触摸事件,不再由它处理了,那么这个 view 就会收到一个 action_cancel
触发时机:1)手机触摸在某个子 view,并且 down 也由它消耗,然后慢慢将手指移出该 view 的边界。
2)down 事件由手指触摸的子 view 消耗,但是后续的 move,因为一些条件设置被父 View 拦截了。后续事件不再由该子 view 处理
如果ViewGroup拦截了Move事件,那么这个Move事件将会转化为Cancel事件传递给子view。
例如:最常见的是类似于 scrollview 这种可滚动控件中,如果是手指按下操作后继续滑动,会对之前点中的子控件发送一个 cancel 事件
ACTION_CANCEL:
我们知道如果某一个子View处理了Down事件,那么随之而来的Move和Up事件也会交给它处理。但是交给它处理之前,父View还是可以拦截事件的,如果拦截了事件,那么子View就会收到一个Cancel事件,并且不会收到后续的Move和Up事件。
FLAG_DISALLOW_INTERCEPT:
即使是MOVE和UP事件,在传递给子View之前也是可以通过ViewGroup的onInterceptTouchEvent方法拦截的,如果拦截了,那么该事件就会变成Cancel事件传递给子view。 那么是否有办法,子view不让ViewGroup拦截时间呢?
如果设置了FLAG_DISALLOW_INTERCEPT
这个flag,那么ViewGoup则不会拦截Move和Up事件。