Android事件传递

来源:互联网 发布:广电网络面临的形势 编辑:程序博客网 时间:2024/06/11 02:51

总则

  • 事件触发的第一个回调方法为:dispatchTouchEvent(MotionEvent)
  • 事件最终会在onTouchEvent方法中消费。
  • 哪个控件消费了ACTION_DOWN事件,接下来的所有事件都会在该控件的onTouchEvent方法中消费。

总体流程(Activity, ViewGroup, View)

视图层级为:Activity contentView中有个ViewGroup,ViewGroup中有个View。点击到View中,事件传递过程如下:

首先找到谁消费的ACTION_DOWN事件,ACTION_DOWN事件传递

  • Activity接收到event,经过Activity.dispatchTouchEvent(event)方法向下分发给ViewGroup
  • ViewGroup接收到event,经过ViewGroup.dispatchTouchEvent(event)方法根据ViewGroup.onInterceptTouchEvent(event)方法判断是否向下分发event,如果分发则向下分发给View
  • View接收到event,经过View.dispatchTouchEvent(event)方法将event分发给View.onTouchEvent(event)
  • View.onTouchEvent是否消费ACTION_DOWN事件,如果不消费,事件回传给ViewGroup.dispatchTouchEvent(event)
  • ViewGroup.dispatchTouchEvent(event)将事件分发给ViewGroup.onTouchEvent(event)
  • ViewGroup.onTouchEvent(event)是否消费event事件,如果不消费,事件回传给Activity.dispatchTouchEvent(event)
  • 至此,如果ACTION_DOWN没有被消费,则执行Activity.onTouchEvent(event)

事件跟踪

以Activity、FrameLayout、TextView为例,事件传递监听(DOWN、MOVE、UP)如下:


Activity, FrameLayout, TextView全为默认设置时的监听

activity.dispatchTouchEvent: 1, action = ACTION_DOWNframeLayout.dispatchTouchEvent: 1, action = ACTION_DOWNframeLayout.onInterceptTouchEvent: 1, action = ACTION_DOWNframeLayout.onInterceptTouchEvent: 2, action = ACTION_DOWN result = falsetextView.dispatchTouchEvent: 1, action = ACTION_DOWNtextView.onTouchEvent: 1, action = ACTION_DOWNtextView.onTouchEvent: 2, action = ACTION_DOWN result = falsetextView.dispatchTouchEvent: 2,  action = ACTION_DOWN result = falseframeLayout.onTouchEvent: 1, action = ACTION_DOWNframeLayout.onTouchEvent: 2, action = ACTION_DOWN result = falseframeLayout.dispatchTouchEvent: 2, action = ACTION_DOWN result = falseactivity.onTouchEvent: 1, action = ACTION_DOWNactivity.onTouchEvent: 2, action = ACTION_DOWN result = falseactivity.dispatchTouchEvent: 2, action = ACTION_DOWN result = false// 以上为 ACTION_DOWN 事件activity.dispatchTouchEvent: 1, action = ACTION_MOVEactivity.onTouchEvent: 1, action = ACTION_MOVEactivity.onTouchEvent: 2, action = ACTION_MOVE result = falseactivity.dispatchTouchEvent: 2, action = ACTION_MOVE result = false// 以上为 ACTION_MOVE 事件activity.dispatchTouchEvent: 1, action = ACTION_UPactivity.onTouchEvent: 1, action = ACTION_UPactivity.onTouchEvent: 2, action = ACTION_UP result = falseactivity.dispatchTouchEvent: 2, action = ACTION_UP result = false// 以上为 ACTION_UP 事件

当TextView.onTouchEvent(event)返回值设置为true, 其它为默认值时

activity.dispatchTouchEvent: 1, action = ACTION_DOWNframeLayout.dispatchTouchEvent: 1, action = ACTION_DOWNframeLayout.onInterceptTouchEvent: 1, action = ACTION_DOWNframeLayout.onInterceptTouchEvent: 2, action = ACTION_DOWN result = falsetextView.dispatchTouchEvent: 1, action = ACTION_DOWNtextView.onTouchEvent: 1, action = ACTION_DOWNtextView.onTouchEvent: 2, action = ACTION_DOWN result = falsetextView.dispatchTouchEvent: 2,  action = ACTION_DOWN result = trueframeLayout.dispatchTouchEvent: 2, action = ACTION_DOWN result = trueactivity.dispatchTouchEvent: 2, action = ACTION_DOWN result = true// 以上为 ACTION_DOWN 事件activity.dispatchTouchEvent: 1, action = ACTION_MOVEframeLayout.dispatchTouchEvent: 1, action = ACTION_MOVEframeLayout.onInterceptTouchEvent: 1, action = ACTION_MOVEframeLayout.onInterceptTouchEvent: 2, action = ACTION_MOVE result = falsetextView.dispatchTouchEvent: 1, action = ACTION_MOVEtextView.onTouchEvent: 1, action = ACTION_MOVEtextView.onTouchEvent: 2, action = ACTION_MOVE result = falsetextView.dispatchTouchEvent: 2,  action = ACTION_MOVE result = trueframeLayout.dispatchTouchEvent: 2, action = ACTION_MOVE result = trueactivity.dispatchTouchEvent: 2, action = ACTION_MOVE result = true// 以上为 ACTION_MOVE 事件activity.dispatchTouchEvent: 1, action = ACTION_UPframeLayout.dispatchTouchEvent: 1, action = ACTION_UPframeLayout.onInterceptTouchEvent: 1, action = ACTION_UPframeLayout.onInterceptTouchEvent: 2, action = ACTION_UP result = falsetextView.dispatchTouchEvent: 1, action = ACTION_UPtextView.onTouchEvent: 1, action = ACTION_UPtextView.onTouchEvent: 2, action = ACTION_UP result = falsetextView.dispatchTouchEvent: 2,  action = ACTION_UP result = trueframeLayout.dispatchTouchEvent: 2, action = ACTION_UP result = trueactivity.dispatchTouchEvent: 2, action = ACTION_UP result = true// 以上为 ACTION_UP 事件

当FrameLayout.onTouchEvent(event)返回值设置为true, 其它为默认值时

activity.dispatchTouchEvent: 1, action = ACTION_DOWNframeLayout.dispatchTouchEvent: 1, action = ACTION_DOWNframeLayout.onInterceptTouchEvent: 1, action = ACTION_DOWNframeLayout.onInterceptTouchEvent: 2, action = ACTION_DOWN result = falsetextView.dispatchTouchEvent: 1, action = ACTION_DOWNtextView.onTouchEvent: 1, action = ACTION_DOWNtextView.onTouchEvent: 2, action = ACTION_DOWN result = falsetextView.dispatchTouchEvent: 2,  action = ACTION_DOWN result = falseframeLayout.onTouchEvent: 1, action = ACTION_DOWNframeLayout.onTouchEvent: 2, action = ACTION_DOWN result = falseframeLayout.dispatchTouchEvent: 2, action = ACTION_DOWN result = trueactivity.dispatchTouchEvent: 2, action = ACTION_DOWN result = true// 以上为 ACTION_DOWN 事件activity.dispatchTouchEvent: 1, action = ACTION_MOVEframeLayout.dispatchTouchEvent: 1, action = ACTION_MOVEframeLayout.onTouchEvent: 1, action = ACTION_MOVEframeLayout.onTouchEvent: 2, action = ACTION_MOVE result = falseframeLayout.dispatchTouchEvent: 2, action = ACTION_MOVE result = trueactivity.dispatchTouchEvent: 2, action = ACTION_MOVE result = true// 以上为 ACTION_MOVE 事件activity.dispatchTouchEvent: 1, action = ACTION_UPframeLayout.dispatchTouchEvent: 1, action = ACTION_UPframeLayout.onTouchEvent: 1, action = ACTION_UPframeLayout.onTouchEvent: 2, action = ACTION_UP result = falseframeLayout.dispatchTouchEvent: 2, action = ACTION_UP result = trueactivity.dispatchTouchEvent: 2, action = ACTION_UP result = true// 以上为 ACTION_UP 事件

当TextView.onTouchEvent(event)与FrameLayout.onTouchEvent(event)返回值都为true时(与只设置TextView.onTouchEvent(event)返回值为true时一样):

activity.dispatchTouchEvent: 1, action = ACTION_DOWNframeLayout.dispatchTouchEvent: 1, action = ACTION_DOWNframeLayout.onInterceptTouchEvent: 1, action = ACTION_DOWNframeLayout.onInterceptTouchEvent: 2, action = ACTION_DOWN result = falsetextView.dispatchTouchEvent: 1, action = ACTION_DOWNtextView.onTouchEvent: 1, action = ACTION_DOWNtextView.onTouchEvent: 2, action = ACTION_DOWN result = falsetextView.dispatchTouchEvent: 2,  action = ACTION_DOWN result = trueframeLayout.dispatchTouchEvent: 2, action = ACTION_DOWN result = trueactivity.dispatchTouchEvent: 2, action = ACTION_DOWN result = true// 以上为 ACTION_DOWN 事件activity.dispatchTouchEvent: 1, action = ACTION_MOVEframeLayout.dispatchTouchEvent: 1, action = ACTION_MOVEframeLayout.onInterceptTouchEvent: 1, action = ACTION_MOVEframeLayout.onInterceptTouchEvent: 2, action = ACTION_MOVE result = falsetextView.dispatchTouchEvent: 1, action = ACTION_MOVEtextView.onTouchEvent: 1, action = ACTION_MOVEtextView.onTouchEvent: 2, action = ACTION_MOVE result = falsetextView.dispatchTouchEvent: 2,  action = ACTION_MOVE result = trueframeLayout.dispatchTouchEvent: 2, action = ACTION_MOVE result = trueactivity.dispatchTouchEvent: 2, action = ACTION_MOVE result = true// 以上为 ACTION_MOVE 事件activity.dispatchTouchEvent: 1, action = ACTION_UPframeLayout.dispatchTouchEvent: 1, action = ACTION_UPframeLayout.onInterceptTouchEvent: 1, action = ACTION_UPframeLayout.onInterceptTouchEvent: 2, action = ACTION_UP result = falsetextView.dispatchTouchEvent: 1, action = ACTION_UPtextView.onTouchEvent: 1, action = ACTION_UPtextView.onTouchEvent: 2, action = ACTION_UP result = falsetextView.dispatchTouchEvent: 2,  action = ACTION_UP result = trueframeLayout.dispatchTouchEvent: 2, action = ACTION_UP result = trueactivity.dispatchTouchEvent: 2, action = ACTION_UP result = true// 以上为 ACTION_UP 事件

FrameLayout.onInterceptTouchEvent(event)返回值都为true,其它为默认时:

activity.dispatchTouchEvent: 1, action = ACTION_DOWNframeLayout.dispatchTouchEvent: 1, action = ACTION_DOWNframeLayout.onInterceptTouchEvent: 1, action = ACTION_DOWNframeLayout.onInterceptTouchEvent: 2, action = ACTION_DOWN result = falseframeLayout.onTouchEvent: 1, action = ACTION_DOWNframeLayout.onTouchEvent: 2, action = ACTION_DOWN result = falseframeLayout.dispatchTouchEvent: 2, action = ACTION_DOWN result = falseactivity.onTouchEvent: 1, action = ACTION_DOWNactivity.onTouchEvent: 2, action = ACTION_DOWN result = falseactivity.dispatchTouchEvent: 2, action = ACTION_DOWN result = false// 以上为 ACTION_DOWN 事件activity.dispatchTouchEvent: 1, action = ACTION_MOVEactivity.onTouchEvent: 1, action = ACTION_MOVEactivity.onTouchEvent: 2, action = ACTION_MOVE result = falseactivity.dispatchTouchEvent: 2, action = ACTION_MOVE result = false// 以上为 ACTION_MOVE 事件activity.dispatchTouchEvent: 1, action = ACTION_UPactivity.onTouchEvent: 1, action = ACTION_UPactivity.onTouchEvent: 2, action = ACTION_UP result = falseactivity.dispatchTouchEvent: 2, action = ACTION_UP result = false// 以上为 ACTION_UP 事件

参数说明: 1为进入方法时执行,2为离开方法时执行,action为MotionEvent.ACTION_, result为父类方法返回值

0 0