关于事件分发中,当OnTouchEvent中ACTION_MOVE是否会执行的分析。
1,当MyView的OnTouchEvent返回false时:
come.isuixin.debug E/MyViewGroup: onInterceptTouchEvent ACTION_DOWN
come.isuixin.debug E/MyView: onTouchEvent ACTION_DOWN
come.isuixin.debug E/MyViewGroup: onTouchEvent ACTION_DOWN
可以看到,MyView在OnTouchEvent方法中,只执行了ACTION_DOWN,并没有ACTION_MOVE。所以,在view中,如果down事件没有被消耗,那么move up这些后续事件就不会再交给view的OnTouchEvent方法啦。
而且在MyViewGroup的onInterceptTouchEvent方法中,也只有ACTION_DOWN事件。
2,当MyView的OnTouchEvent返回true时:
come.isuixin.debug E/MyViewGroup: onInterceptTouchEvent ACTION_DOWN
come.isuixin.debug E/MyView: onTouchEvent ACTION_DOWN
come.isuixin.debug E/MyViewGroup: onInterceptTouchEvent ACTION_MOVE
come.isuixin.debug E/MyView: onTouchEvent ACTION_MOVE
come.isuixin.debug E/MyViewGroup: onInterceptTouchEvent ACTION_MOVE
come.isuixin.debug E/MyView: onTouchEvent ACTION_MOVE
come.isuixin.debug E/MyViewGroup: onInterceptTouchEvent ACTION_UP
come.isuixin.debug E/MyView: onTouchEvent ACTION_UP
可以看到,MyView在OnTouchEvent方法中,ACTION_DOWN ACTION_MOVE ACTION_UP都执行啦。MyViewGroup的OnTouchEvent方法中没有被调用。这是因为事件在MyView中被消耗,不会往外传递啦。
3,当MyView的OnTouchEvent返回true,MyViewGroup在onInterceptTouchEvent中的move时拦截:
come.isuixin.debug E/MyViewGroup: onInterceptTouchEvent ACTION_DOWN
come.isuixin.debug E/MyView: onTouchEvent ACTION_DOWN
come.isuixin.debug E/MyViewGroup: onInterceptTouchEvent ACTION_MOVE
come.isuixin.debug E/MyView: onTouchEvent ACTION_CANCEL
come.isuixin.debug E/MyViewGroup: onTouchEvent ACTION_MOVE
come.isuixin.debug E/MyViewGroup: onTouchEvent ACTION_MOVE
come.isuixin.debug E/MyViewGroup: onTouchEvent ACTION_UP
可以看到,这时myView会收到cancel事件,后续的move up都会交给viewGroup的OnTouchEvent来处理,拦截方法不再走。
总结:
当View的OnTouchEvent返回false时(默认返回的是false):down事件首先传递到ViewGroup的onInterceptTouchEvent
然后传递到view的OnTouchEvent.因为返回false,不处理,所以又返回给ViewGroup的OnTouchEvent.如果ViewGroup的
OnTouchEvent返回true,那么后续move up不会走onInterceptTouchEvent,而是直接交给onTouchEvent. 如果ViewGroup的 OnTouchEvent返回false,那么说明ViewGroup层也不会消耗事件序列,那么后续的move up等事件不会到View Group的onInterceptTouchEvent中。