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
- android 事件传递机制
- android 事件传递机制
- android触摸事件传递
- android事件传递机制
- android 事件传递
- Android触摸事件传递
- Android事件传递机制
- Android 事件传递机制
- android 事件的传递
- Android事件传递机制
- Android中的事件传递
- Android事件传递机制
- Android事件传递机制
- Android事件传递机制
- Android事件传递机制
- Android事件传递机制
- Android事件传递机制
- android touch事件传递
- python 操作数据库
- VO对象和PO对象的区别
- XpSp3(未开启PAE模式)内存管理之系统PTE区域 上
- Java解析json(二):jackson
- py-faster-rcnn制作自己的数据集做目标检测
- Android事件传递
- 转载:分享这五年电商网站网络推广的深刻经历
- Android Activity堆栈详解
- Android中APK直接通过JNI访问驱动
- Java解析json(三):fastjson
- 使用Enumeration和Iterator遍历集合类详解
- 详解 QT 布局管理界面 图文并茂
- 获取android项目中sqlite数据库
- Android Error:Execution failed for task ':app:transformClassesWithDexForRelease'错误小记