Android中ACTION_CANCEl的触发机制
首先来看下ACTION_CANCEl在android framework中哪里定义的:
再看下翻译:
它的触发时机通常有以下几种情况:
1 在子View处理事件的过程中,父View对事件拦截
2 ACTION_DOWN初始化操作中
3 在子View处理事件的过程中被父View中移除
4 子View被设置为了PFLAG_CANCEL_NEXT_UP_EVENT标志位时
下面我们来一一进行源码分析:
在子View处理事件的过程中,父View对事件拦截会触发
1.1 判断1 :当事件是DOWN或者mFirstTouchTarget !=null(这里其实就是已经处理了DOWN事件,具体原因下篇讲)
那么就会取出FLAG_DISALLOW_INTERCEPT这个标志位,看是否存在。这个标志位是子View调用这个方法时候requestDisallowInterceptTouchEvent(true)才会赋值上去的,目前肯定是返回false。
1.2 那么现在就会走返回3语句,父View对事件进行拦截,返回了true。
1.3 继续看判断4,不满足的明显(当有View处理了DOWN事件,mFirstTouchTarget就不会为Null) 那么就会走到语句5 ,上述intercepted变量值已经为true的,所以当执行语句6时,cancelChild是true的。
1.4 当传过来的cancel为true时,那么就会走到event.setAction(MotionEvent.ACTION_CANCEL); //语句8。接着子View不为空,那么就会走到语句9,分发给子View的ACTION_CANCEL事件。
2 ACTION_DOWN初始化操作会触发
2.1 当执行ACTION_DOWN,需要在此时丢弃掉所有前面的状态。
dispatchTransformedTouchEvent(event, true, target.child, target.pointerIdBits);语句此时的第二个cancel参数为true。后面如上述1情况。
3 在子View处理事件的过程中被父View移除时触发
3.1 语句1会创建一个ACTION_CANCEL事件对象obtain方法,有点像Handler机制里面创建message一样,应该也是应用到对象复用,使用的享元模式
语句2 把CANCEL事件分发给目标View。
4 子View被设置了PFLAG_CANCEL_NEXT_UP_EVENT标志时
现在我回到情况的某一张截图:
此时语句5:final boolean cancelChild = resetCancelNextUpFlag(target.child)
|| intercepted; 如果resetCancelNextUpFlag返回true时,同意也会导致发送cancel事件
此时取出PFLAG_CANCEL_NEXT_UP_EVENT标志位,如果有此标志位,那么返回true,否则返回false。