touch事件一直是Android学习者一个头疼的问题,为了更好的学习事件的传递,咱们来探索一下bash
touch事件有以下几种:源码分析
Activity中包括:布局
dispatchTouchEvent
onTouchEvent学习
ViewGroup有:测试
dispatchTouchEvent
onTouchEvent
onInterceptTouchEventspa
View有:3d
dispatchTouchEvent
onTouchEvent日志
写一个demo,经过实践来总结事件传递的方式,页面布局以下,咱们经过点击view来测试touch的传递过程code
首先,咱们自定义三个view,Group1,Group2和view,分别重写Activity和他们的touch事件,经过点击View打印的日志来看view的传递cdn
activity代码
viewGroup1 代码
viewGroup2 代码
view 代码
打log,看日志,总结规律
log
规律:
ACTION_DOWN事件会传递到上一级view的onTouch()事件里面处理。若是是在activity里的dispatchTouch()事件返回false, 由于activity已经没有上一级view了,因此事件会被直接消费掉(不会继续传递)。
ACTION_UP事件并无按照类U型的结构去在View树传递,而是直接在Activity的onTouchEvent方法中消费掉了。
规律:
ACTION_DOWN事件会在返回true的事件中直接消费掉,不会在继续传递。
ACTION_UP事件和down事件同样在返回true的事件中直接消费掉,不会传递。
ACTION_DOWN事件传递和返回super传递同样,因此返回false和默认事件传递同样。
ACTION_UP事件和默认的传递同样。
ACTION_DOWN:当在onInterceptTouchEvent()返回true时,事件会传递到本身的onTouchEvent()中处理
ACTION_UP:事件和默认的传递同样。
ACTION_DOWN事件传递和返回super传递同样,因此返回false和默认事件传递同样。
ACTION_UP事件和默认的传递同样。
ACTION_DOWN:事件在onTouch()被消费掉,不会在继续传递 ACTION_UP事件传递路径和ACTION_DOWN同样,在事件被消费掉以后不会继续传递
思考总结
ACTION_DOWN:
1.返回false和默认的传递路基同样。
2.在dispatchTouchEvent()和onTouchEvent()中返回true会消费掉当前事件,不会在继续传递。
3.在onInterceptTouchEvent()中返回true,事件会直接传递到本身的onTouchEvent()事件中,而不会向子view传递。
ACTION_UP:
1.事件返回false是传递路径从当前activity的diapatchTouchEvent传递到本身的onTouchEvent()中。
2.在dispatchTouchEvent()和onTouchEvent()中返回true会消费掉当前事件,不会在继续传递。传递路径和ACTION_DOWN路径同样。
3.在onInterceptTouchEvent()中返回true,传递路径和1的路径同样。
复制代码
固然,总结的规律仍是要靠源码的逻辑支撑,下一期我会上源码分析,来支撑探究的规律