这篇博文是基于上篇《Android 事件机制探讨(1)《基础扩展而来,建议读本文之前先阅读上一篇。
事件的分发流程很复杂,接下来我们就引入setOnTouchListener和setOnClickListener来深入讲解,首先为ViewPager添加setOnTouchListener方法并打印日志,完整代码如下:
运行日志如下:
就看ACTION_DOWN 这个事件,从MainActivity中dispatchEvent到ViewPager中dispatchEvent,再到onIntercepTouchEvent,至此ACTION_DOWN执行结束了。
我们从日志可以看出ACTION_DOWN、ACIONT_MOVE、ACTION_UP三个事件都会传递到View里,但是都会在onTouch方法里终止传递,且并没有执行onTouchEvent事件消费方法,所以结论是:用户设置的setOnTouchListener会在onTouchEvent方法前调用,并且onTouch的返回值是false的话,会继续执行onTouchEvent方法,如果返回true的话,表明该事件被消费了,事件终止传递(我们在ViewGroup也设置了setOnTouchListener方法,但没有被执行,也是这个原因),并不会执行onTouchEvent方法。
ACTION_DOWN分发到View的onTouch,此时返回值为false,没有消费事件,继续执行onTouchEvent方法,该返回一样返回false,事件再往上传递给ViewGroup的onTouchEvent方法,因为我们为ViewGroup设置了setOnTouchListener,所以在执行onTouchEvent之前会先执行onTouch,而我们在onTouch方法返回了true,表明该事件被消费,接着传递终止,所以ViewGroup的onTouchEvent方法并没有被执行。