Android 编程下 Touch 事件的分发和消费机制(二)

Case 1

拦截条件

控件名称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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值