View(ViewGroup)事件传递《2》
2018-01-25 16:21
555 查看
触摸事件的传递顺序是由Acitivty到ViewGroup,再由ViewGroup递归传递给它的子View。
ViewGroup通过onInterceptTouchEvent方法对事件进行拦截,如果该方法返回true,则事件不会继续传递给子View。
如何返回false或者super.onInterceptTouchEvent(event);则事件会继续传递到子View.
按默认的返回super 运行结果:
MyRelativeLayout([b][b]ViewGroup[/b]) dispatchTouchEvent return true
事件到ViewGroup 传递到dispatchTouchEvent被消耗后,不再传递给它的子View[/b]:
MyRelativeLayout dispatchTouchEvent return false:
[b]ViewGroup 没有给它子View传递Action_Down事件,而是传递给父布局(MainActivity)的onTouchEvent,并且
后续的系列事件也没有再传递给ViewGroup[/b]
MyRelativeLayout onInterceptTouchEvent return true:
MyRelativeLayout onTouchEvent return true(即消耗事件)
事件不传递到子控件,到它的onTouchEvent执行完后 不再传递给子View
MyRelativeLayout onInterceptTouchEvent return true:
MyRelativeLayout onTouchEvent return super.onTouchEvent(event) 或者 return fasle(即不消耗事件)
[b][b]ViewGroup[/b]事件不传递给子View,并且后续系列事件不再传给[b][b]ViewGroup[/b][/b][/b]
MyRelativeLayout onInterceptTouchEvent return false:
[b][b][b]ViewGroup[/b][/b]不拦截事件,即与默认事件传递的结果一致,[b][b]ViewGroup会将点击事件传递到子View[/b][/b]:[/b]
调试DEMO(所有的参数都是默认的),修改返回值,进行测试
ViewGroup通过onInterceptTouchEvent方法对事件进行拦截,如果该方法返回true,则事件不会继续传递给子View。
如何返回false或者super.onInterceptTouchEvent(event);则事件会继续传递到子View.
按默认的返回super 运行结果:
01-25 15:07:44.888 24301-24301/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent Action_Down 01-25 15:07:44.889 24301-24301/com.qiandu.viewdispatchevent E/MyRelativeLayout: dispatchTouchEvent Action_Down 01-25 15:07:44.889 24301-24301/com.qiandu.viewdispatchevent E/MyRelativeLayout: onInterceptTouchEvent Action_Down 01-25 15:07:44.889 24301-24301/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent Action_Down 01-25 15:07:44.889 24301-24301/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener Action_Down 01-25 15:07:44.889 24301-24301/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent Action_Down 01-25 15:07:44.948 24301-24301/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE 01-25 15:07:44.948 24301-24301/com.qiandu.viewdispatchevent E/MyRelativeLayout: dispatchTouchEvent ACTION_MOVE 01-25 15:07:44.948 24301-24301/com.qiandu.viewdispatchevent E/MyRelativeLayout: onInterceptTouchEvent ACTION_MOVE 01-25 15:07:44.948 24301-24301/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent ACTION_MOVE 01-25 15:07:44.948 24301-24301/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener ACTION_MOVE 01-25 15:07:44.948 24301-24301/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent ACTION_MOVE 01-25 15:07:44.948 24301-24301/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_UP 01-25 15:07:44.948 24301-24301/com.qiandu.viewdispatchevent E/MyRelativeLayout: dispatchTouchEvent ACTION_UP 01-25 15:07:44.948 24301-24301/com.qiandu.viewdispatchevent E/MyRelativeLayout: onInterceptTouchEvent ACTION_UP 01-25 15:07:44.948 24301-24301/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent ACTION_UP 01-25 15:07:44.948 24301-24301/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener ACTION_UP 01-25 15:07:44.948 24301-24301/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent ACTION_UP 01-25 15:07:44.948 24301-24301/com.qiandu.viewdispatchevent E/MainActivity: OnClickListener onClick
MyRelativeLayout([b][b]ViewGroup[/b]) dispatchTouchEvent return true
事件到ViewGroup 传递到dispatchTouchEvent被消耗后,不再传递给它的子View[/b]:
01-25 15:18:28.099 1975-1975/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent Action_Down 01-25 15:18:28.100 1975-1975/com.qiandu.viewdispatchevent E/MyRelativeLayout: dispatchTouchEvent Action_Down 01-25 15:18:28.173 1975-1975/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE 01-25 15:18:28.173 1975-1975/com.qiandu.viewdispatchevent E/MyRelativeLayout: dispatchTouchEvent ACTION_MOVE 01-25 15:18:28.175 1975-1975/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_UP 01-25 15:18:28.175 1975-1975/com.qiandu.viewdispatchevent E/MyRelativeLayout: dispatchTouchEvent ACTION_UP
MyRelativeLayout dispatchTouchEvent return false:
[b]ViewGroup 没有给它子View传递Action_Down事件,而是传递给父布局(MainActivity)的onTouchEvent,并且
后续的系列事件也没有再传递给ViewGroup[/b]
01-25 15:20:23.911 4555-4555/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent Action_Down 01-25 15:20:23.911 4555-4555/com.qiandu.viewdispatchevent E/MyRelativeLayout: dispatchTouchEvent Action_Down 01-25 15:20:23.911 4555-4555/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent Action_Down 01-25 15:20:23.953 4555-4555/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_UP 01-25 15:20:23.953 4555-4555/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent ACTION_UP
MyRelativeLayout onInterceptTouchEvent return true:
MyRelativeLayout onTouchEvent return true(即消耗事件)
事件不传递到子控件,到它的onTouchEvent执行完后 不再传递给子View
01-25 15:55:05.211 5616-5616/? E/art: setrlimit(RLIMIT_CORE) failed for pid 5616: Operation not permitted 01-25 15:55:06.853 5616-5616/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent Action_Down 01-25 15:55:06.853 5616-5616/com.qiandu.viewdispatchevent E/MyRelativeLayout: dispatchTouchEvent Action_Down 01-25 15:55:06.853 5616-5616/com.qiandu.viewdispatchevent E/MyRelativeLayout: onInterceptTouchEvent Action_Down 01-25 15:55:06.853 5616-5616/com.qiandu.viewdispatchevent E/MyRelativeLayout: onTouchEvent Action_Down 01-25 15:55:06.899 5616-5616/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE 01-25 15:55:06.899 5616-5616/com.qiandu.viewdispatchevent E/MyRelativeLayout: dispatchTouchEvent ACTION_MOVE 01-25 15:55:06.899 5616-5616/com.qiandu.viewdispatchevent E/MyRelativeLayout: onTouchEvent ACTION_MOVE 01-25 15:55:06.910 5616-5616/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_UP 01-25 15:55:06.910 5616-5616/com.qiandu.viewdispatchevent E/MyRelativeLayout: dispatchTouchEvent ACTION_UP 01-25 15:55:06.910 5616-5616/com.qiandu.viewdispatchevent E/MyRelativeLayout: onTouchEvent ACTION_UP
MyRelativeLayout onInterceptTouchEvent return true:
MyRelativeLayout onTouchEvent return super.onTouchEvent(event) 或者 return fasle(即不消耗事件)
[b][b]ViewGroup[/b]事件不传递给子View,并且后续系列事件不再传给[b][b]ViewGroup[/b][/b][/b]
01-25 15:25:16.713 9492-9492/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent Action_Down 01-25 15:25:16.714 9492-9492/com.qiandu.viewdispatchevent E/MyRelativeLayout: dispatchTouchEvent Action_Down 01-25 15:25:16.714 9492-9492/com.qiandu.viewdispatchevent E/MyRelativeLayout: onInterceptTouchEvent Action_Down 01-25 15:25:16.714 9492-9492/com.qiandu.viewdispatchevent E/MyRelativeLayout: onTouchEvent Action_Down 01-25 15:25:16.714 9492-9492/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent Action_Down 01-25 15:25:16.793 9492-9492/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE 01-25 15:25:16.793 9492-9492/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent ACTION_MOVE 01-25 15:25:16.809 9492-9492/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE 01-25 15:25:16.809 9492-9492/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent ACTION_MOVE 01-25 15:25:16.810 9492-9492/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_UP 01-25 15:25:16.810 9492-9492/com.qiandu.viewdispatchevent E/MainActivity: onTouchEvent ACTION_UP
MyRelativeLayout onInterceptTouchEvent return false:
[b][b][b]ViewGroup[/b][/b]不拦截事件,即与默认事件传递的结果一致,[b][b]ViewGroup会将点击事件传递到子View[/b][/b]:[/b]
01-25 15:28:15.617 12095-12095/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent Action_Down 01-25 15:28:15.617 12095-12095/com.qiandu.viewdispatchevent E/MyRelativeLayout: dispatchTouchEvent ad5f Action_Down 01-25 15:28:15.617 12095-12095/com.qiandu.viewdispatchevent E/MyRelativeLayout: onInterceptTouchEvent Action_Down 01-25 15:28:15.617 12095-12095/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent Action_Down 01-25 15:28:15.617 12095-12095/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener Action_Down 01-25 15:28:15.617 12095-12095/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent Action_Down 01-25 15:28:15.675 12095-12095/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_MOVE 01-25 15:28:15.675 12095-12095/com.qiandu.viewdispatchevent E/MyRelativeLayout: dispatchTouchEvent ACTION_MOVE 01-25 15:28:15.675 12095-12095/com.qiandu.viewdispatchevent E/MyRelativeLayout: onInterceptTouchEvent ACTION_MOVE 01-25 15:28:15.675 12095-12095/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent ACTION_MOVE 01-25 15:28:15.675 12095-12095/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener ACTION_MOVE 01-25 15:28:15.675 12095-12095/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent ACTION_MOVE 01-25 15:28:15.675 12095-12095/com.qiandu.viewdispatchevent E/MainActivity: dispatchTouEvent ACTION_UP 01-25 15:28:15.675 12095-12095/com.qiandu.viewdispatchevent E/MyRelativeLayout: dispatchTouchEvent ACTION_UP 01-25 15:28:15.675 12095-12095/com.qiandu.viewdispatchevent E/MyRelativeLayout: onInterceptTouchEvent ACTION_UP 01-25 15:28:15.675 12095-12095/com.qiandu.viewdispatchevent E/MyTextVIew: dispatchTouEvent ACTION_UP 01-25 15:28:15.675 12095-12095/com.qiandu.viewdispatchevent E/MainActivity: OnTouchListener ACTION_UP 01-25 15:28:15.675 12095-12095/com.qiandu.viewdispatchevent E/MyTextVIew: onTouchEvent ACTION_UP 01-25 15:28:15.675 12095-12095/com.qiandu.viewdispatchevent E/MainActivity: OnClickListener onClick
调试DEMO(所有的参数都是默认的),修改返回值,进行测试
相关文章推荐
- Android Activity 和 ViewGroup中事件触发和传递机制
- [学习总结]4、Android的ViewGroup中事件的传递机制(一)
- (转)Android ViewGroup中事件触发和传递机制
- Android ViewGroup 触摸事件传递机制
- View及ViewGroup的事件分发及传递(二)
- Android ViewGroup中事件触发和传递机制
- View及ViewGroup的事件分发及传递(二)
- Android ViewGroup 触摸事件传递机制
- Android中ViewGroup到View的Touch事件的传递机制
- Android ViewGroup中事件触发和传递机制
- Android ViewGroup中事件触发和传递机制
- View及ViewGroup的事件分发及传递(一)
- Android ViewGroup中事件触发和传递机制
- Android Activity 和 ViewGroup中事件触发和传递机制
- View及ViewGroup的事件分发及传递(一)
- Android ViewGroup中事件触发和传递机制
- View及ViewGroup的事件分发及传递(二)
- Android ViewGroup和View的传递事件
- [学习总结]5、Android的ViewGroup中事件的传递机制(二)
- View及ViewGroup的事件分发及传递(一)