您的位置:首页 > 其它

View(ViewGroup)事件传递《2》

2018-01-25 16:21 555 查看
触摸事件的传递顺序是由Acitivty到ViewGroup,再由ViewGroup递归传递给它的子View。

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(所有的参数都是默认的),修改返回值,进行测试
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息