触摸事件的传递顺序是由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(ViewGroup) dispatchTouchEvent return true
事件到ViewGroup 传递到dispatchTouchEvent被消耗后,不再传递给它的子View:
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:
ViewGroup 没有给它子View传递Action_Down事件,而是传递给父布局(MainActivity)的onTouchEvent,并且
后续的系列事件也没有再传递给ViewGroup
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(即不消耗事件)
ViewGroup事件不传递给子View,并且后续系列事件不再传给ViewGroup
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:ViewGroup不拦截事件,即与默认事件传递的结果一致,ViewGroup会将点击事件传递到子View:
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 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(所有的参数都是默认的),修改返回值,进行测试