拦截条件
控件名称dispatchTouchEvent 返回值onInterceptTouchEvent 返回值onTouchEvent 返回值
TouchEventActivitysuper.dispatchTouchEvent(ev)---super.onTouchEvent(ev)
TouchEventFatherfalsesuper.onInterceptTouchEvent(ev)super.onTouchEvent(ev)
TouchEventChildssuper.dispatchTouchEvent(ev)super.onInterceptTouchEvent(ev)super.onTouchEvent(ev)
运行结果
LevelTimePIDApplicationTag Text
W 05-10 03:41:19.743 414cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_DOWN
E 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_DOWN
W 05-10 03:41:19.743 414cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_DOWN
W 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE
W 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVE
W 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE
W 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVE
W 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_UP
W 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_UP
结果分析
代码运行后,事件首先由 TouchEventActivity 的 dispatchTouchEvent 方法分发给 TouchEventFather 控件的dispatchTouchEvent,而该控件的 dispatchTouchEvent 返回 false,表示对获取到的事件停止向下传递,同时也不对该事件进行消费。由于 TouchEventFather 获取的事件直接来自 TouchEventActivity ,则会将事件返回给 TouchEventActivity 的 onTouchEvent 进行消费,最后直接由 TouchEventActivity 来响应手指移动和抬起事件。
Case 2
拦截条件
控件名称dispatchTouchEvent 返回值onInterceptTouchEvent 返回值onTouchEvent 返回值
TouchEventActivitysuper.dispatchTouchEvent(ev)---super.onTouchEvent(ev)
TouchEventFathertruesuper.onInterceptTouchEvent(ev)super.onTouchEvent(ev)
TouchEventChildssuper.dispatchTouchEvent(ev)super.onInterceptTouchEvent(ev)super.onTouchEvent(ev)
运行结果
LevelTimePIDApplicationTag Text
W 05-10 03:41:19.743 414cn.sunzn.tevent sunzn TouchEventActivity | dispatchTouchEvent --> ACTION_DOWN
E 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_DOWN
W 05-10 03:41:19.743 414cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE
E 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_MOVE
W 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE
E 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_MOVE
W 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE
E 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_MOVE
W 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_UP
E 05-10 03:41:19.743 414 cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_UP
结果分析
代码运行后,事件首先由 TouchEventActivity 的 dispatchTouchEvent 方法分发给 TouchEventFather 控件的 dispatchTouchEvent,而该控件的 dispatchTouchEvent 返回 true,表示分发事件到 TouchEventFather 控件并由该控件的 dispatchTouchEvent 进行消费;TouchEventActivity 不断的分发事件到 TouchEventFather 控件的dispatchTouchEvent,而 TouchEventFather 控件的 dispatchTouchEvent 也不断的将获取到的事件进行消费。
Case 3
拦截条件
控件名称dispatchTouchEvent 返回值onInterceptTouchEvent 返回值onTouchEvent 返回值
TouchEventActivitysuper.dispatchTouchEvent(ev)---super.onTouchEvent(ev)
TouchEventFathersuper.dispatchTouchEvent(ev)truesuper.onTouchEvent(ev)
TouchEventChildssuper.dispatchTouchEvent(ev)super.onInterceptTouchEvent(ev)super.onTouchEvent(ev)
运行结果
LevelTimePIDApplicationTag Text
W05-10 05:34:46.333481cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_DOWN
E05-10 05:34:46.333481cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_DOWN
I05-10 05:34:46.333481cn.sunzn.teventsunzn TouchEventFather | onInterceptTouchEvent --> ACTION_DOWN
D05-10 05:34:46.333481cn.sunzn.teventsunzn TouchEventFather | onTouchEvent --> ACTION_DOWN
W05-10 05:34:46.333481cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_DOWN
W05-10 05:34:46.343481cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE
W05-10 05:34:46.343481cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVE
W05-10 05:34:46.423481cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE
W05-10 05:34:46.423481cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVE
W05-10 05:34:46.433481cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE
W05-10 05:34:46.433481cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVE
W05-10 05:34:46.442481cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_UP
W05-10 05:34:46.442481cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_UP
结果分析
代码运行后,事件首先由 TouchEventActivity 的 dispatchTouchEvent 方法分发给 TouchEventFather 控件的 dispatchTouchEvent,而该控件的 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev),表示对事件进行分发并向下传递给 TouchEventFather 控件的 onInterceptTouchEvent 方法,该方法返回 true 表示对所获取到的事件进行拦截并将事件传递给 TouchEventFather 控件的 onTouchEvent 进行处理,TouchEventFather 控件的 onTouchEvent 返回 super.onTouchEvent(ev) 表示对事件没有做任何处理直接将事件返回给上级控件,由于 TouchEventFather 获取的事件直接来自 TouchEventActivity,所以 TouchEventFather 控件的 onTouchEvent 会将事件以冒泡方式直接返回给 TouchEventActivity 的 onTouchEvent 进行消费,后续的事件则会跳过 TouchEventFather 直接由 TouchEventActivity 的 onTouchEvent 消费来自 TouchEventActivity 自身分发的事件。
Case 4
拦截条件
控件名称dispatchTouchEvent 返回值onInterceptTouchEvent 返回值onTouchEvent 返回值
TouchEventActivitysuper.dispatchTouchEvent(ev)---super.onTouchEvent(ev)
TouchEventFathersuper.dispatchTouchEvent(ev)falsesuper.onTouchEvent(ev)
TouchEventChildssuper.dispatchTouchEvent(ev)super.onInterceptTouchEvent(ev)super.onTouchEvent(ev)
运行结果
LevelTimePIDApplicationTag Text
W05-10 06:31:47.565512cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_DOWN
E05-10 06:31:47.565512cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_DOWN
I05-10 06:31:47.565512cn.sunzn.teventsunzn TouchEventFather | onInterceptTouchEvent --> ACTION_DOWN
E05-10 06:31:47.565512cn.sunzn.teventsunzn TouchEventChilds | dispatchTouchEvent --> ACTION_DOWN
I05-10 06:31:47.565512cn.sunzn.teventsunzn TouchEventChilds | onInterceptTouchEvent --> ACTION_DOWN
D05-10 06:31:47.565512cn.sunzn.teventsunzn TouchEventChilds | onTouchEvent --> ACTION_DOWN
D05-10 06:31:47.565512cn.sunzn.teventsunzn TouchEventFather | onTouchEvent --> ACTION_DOWN
W05-10 06:31:47.565512cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_DOWN
W05-10 06:31:47.652512cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE
W05-10 06:31:47.652512cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVE
W05-10 06:31:47.732512cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE
W05-10 06:31:47.732512cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVE
W05-10 06:31:47.812512cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE
W05-10 06:31:47.812512cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_MOVE
W05-10 06:31:47.892512cn.sunzn.teventsunzn TouchEventActivity | dispatchTouchEvent --> ACTION_UP
W05-10 06:31:47.892512cn.sunzn.teventsunzn TouchEventActivity | onTouchEvent --> ACTION_UP
结果分析
代码运行后,事件首先由 TouchEventActivity 的 dispatchTouchEvent 方法分发给 TouchEventFather 控件的 dispatchTouchEvent,而该控件的 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev),表示对事件进行分发并向下传递给 TouchEventFather 控件的 onInterceptTouchEvent 方法,该方法返回 false 表示事件会被放行并传递到子控件 TouchEventChilds 的 dispatchTouchEvent 方法,同样 TouchEventChilds 的 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev),表示对事件进行分发并向下传递给 TouchEventChilds 控件的 onInterceptTouchEvent 方法,TouchEventChilds 的 onInterceptTouchEvent 方法返回 super.onInterceptTouchEvent(ev) 默认会将事件传递给 TouchEventChilds 的 onTouchEvent 进行处理,TouchEventChilds 的 onTouchEvent 返回 super.onTouchEvent(ev) 表示对事件没有做任何处理直接将事件返回给上级控件,由于 TouchEventChilds 获取的事件直接来自 TouchEventFather,所以 TouchEventChilds 控件的 onTouchEvent 会将事件以冒泡方式直接返回给 TouchEventFather 的 onTouchEvent 进行消费,而 TouchEventFather 的 onTouchEvent 也返回了 super.onTouchEvent(ev),同样 TouchEventFather 的 onTouchEvent 也会将事件返回给上级控件,而 TouchEventFather 获取的事件直接来自 TouchEventActivity,所以 TouchEventFather 控件的 onTouchEvent 会将事件以冒泡方式直接返回给 TouchEventActivity 的 onTouchEvent 进行消费,后续的事件则会跳过 TouchEventFather 和 TouchEventChilds 直接由 TouchEventActivity 的 onTouchEvent 消费来自 TouchEventActivity 自身分发的事件。
Case 5
拦截条件
控件名称dispatchTouchEvent 返回值onInterceptTouchEvent 返回值onTouchEvent 返回值
TouchEventActivitysuper.dispatchTouchEvent(ev)---super.onTouchEvent(ev)
TouchEventFathersuper.dispatchTouchEvent(ev)falsesuper.onTouchEvent(ev)
TouchEventChildstruesuper.onInterceptTouchEvent(ev)super.onTouchEvent(ev)
运行结果
LevelTimePIDApplicationTag Text
W 05-10 08:11:18.403574 cn.sunzn.tevent sunzn TouchEventActivity | dispatchTouchEvent --> ACTION_DOWN
E 05-10 08:11:18.403574 cn.sunzn.tevent sunzn TouchEventFather | dispatchTouchEvent --> ACTION_DOWN
I 05-10 08:11:18.403574 cn.sunzn.tevent sunzn TouchEventFather | onInterceptTouchEvent --> ACTION_DOWN
E 05-10 08:11:18.403574 cn.sunzn.tevent sunzn TouchEventChilds | dispatchTouchEvent --> ACTION_DOWN
W 05-10 08:11:19.652574 cn.sunzn.tevent sunzn TouchEventActivity | dispatchTouchEvent --> ACTION_MOVE
E 05-10 08:11:19.652574 cn.sunzn.tevent sunzn TouchEventFather | dispatchTouchEvent --> ACTION_MOVE
I 05-10 08:11:19.652574 cn.sunzn.tevent sunzn TouchEventFather | onInterceptTouchEvent --> ACTION_MOVE
E 05-10 08:11:19.652574cn.sunzn.teventsunzn TouchEventChilds | dispatchTouchEvent --> ACTION_MOVE
W 05-10 08:11:19.872574cn.sunzn.tevent sunzn TouchEventActivity | dispatchTouchEvent --> ACTION_UP
E05-10 08:11:19.872574cn.sunzn.teventsunzn TouchEventFather | dispatchTouchEvent --> ACTION_UP
I05-10 08:11:19.872574cn.sunzn.teventsunzn TouchEventFather | onInterceptTouchEvent --> ACTION_UP
E 05-10 08:11:19.872574cn.sunzn.tevent sunzn TouchEventChilds | dispatchTouchEvent --> ACTION_UP
结果分析
代码运行后,事件首先由 TouchEventActivity 的 dispatchTouchEvent 方法分发给 TouchEventFather 控件的 dispatchTouchEvent,该控件的 dispatchTouchEvent 返回super.dispatchTouchEvent(ev),事件会分发到 TouchEventFather 的 onInterceptTouchEvent,onInterceptTouchEvent 返回 false 表示放行当先事件;事件会被传递到子控件 TouchEventChilds 的 dispatchTouchEvent 方法,dispatchTouchEvent 返回 true 表示事件被分发到 TouchEventChilds 控件并由该控件的 dispatchTouchEvent 方法消费。后续的事件也会不断的重复上面的逻辑最终被 TouchEventChilds 的 dispatchTouchEvent 消费。
四、源码下载
下载地址:TouchEvent.rar