然后再上面修改代码,让onTouch()方法消耗事件,也就是返回true,再观察log:
edtv_test.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 为了log显示的层次更加清晰,这里的TAG使用View的TAG Log.i("————View", "onTouch: 返回 " + false); return false; } });log如下:
01-07 11:03:55.411 2757-2757/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件 01-07 11:03:55.412 2757-2757/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件 01-07 11:03:55.412 2757-2757/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false 01-07 11:03:55.412 2757-2757/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件 01-07 11:03:55.412 2757-2757/cn.codingblock.view I/————View: onTouch: 返回 true 01-07 11:03:55.542 2757-2757/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件 01-07 11:03:55.542 2757-2757/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件 01-07 11:03:55.542 2757-2757/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 2 | 是否拦截:false 01-07 11:03:55.542 2757-2757/cn.codingblock.view I/————View: dispatchTouchEvent: 2 | 分发事件 01-07 11:03:55.542 2757-2757/cn.codingblock.view I/————View: onTouch: 返回 true 01-07 11:03:55.560 2757-2757/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件 01-07 11:03:55.560 2757-2757/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件 01-07 11:03:55.560 2757-2757/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 1 | 是否拦截:false 01-07 11:03:55.560 2757-2757/cn.codingblock.view I/————View: dispatchTouchEvent: 1 | 分发事件 01-07 11:03:55.560 2757-2757/cn.codingblock.view I/————View: onTouch: 返回 true从log中我们可以看出:
为View绑定的OnTouchListener中的onTouch()方法是优先于View的onTouchEvent()方法执行的。如果在onTouch()消耗了事件(返回true),那么事件将不在传递给onTouchEvent()方法,最终也不会调用onClick()方法。
为View绑定的OnClickListener中的onClick()方法优先级最低,是在整个事件流结束后才会被调用,也就是需要经过手指的按下--抬起这个过程才会触发onClick()方法。
小结为了更好的理解,可以把事件流看成是一队人,把ACTION_DOWN类型看做探路人,探路人按规定的线路先走一遍,直到走到View的onTouchEvent这里,如果onTouchEvent返回true,可理解成此路通,后续部队可以过来。如果返回false,可以理解成此路不通,然后探路人再到Layout(ViewGroup)的onTouchEvent中问路通不通,如果通的话后续部队就不用再去View那里了,直接到ViewGroup这来就可以了。而如果ViewGroup这里路也不通,那么探路人就只能去Activity的onTouchEvent那里了,后续部队也直接去Activity的onTouchEvent这里就可以了。
最后想说的是,本系列文章为博主对Android知识进行再次梳理,查缺补漏的学习过程,一方面是对自己遗忘的东西加以复习重新掌握,另一方面相信在重新学习的过程中定会有巨大的新收获,如果你也有跟我同样的想法,不妨关注我一起学习,互相探讨,共同进步!
参考文献:
《Android开发艺术探索》