Android中事件的传递
Android中事件的传递
首先来张图看看
1. 核心方法返回值的含义
dispatchTrackballEvent 分发事件
public boolean dispatchTrackballEvent(MotionEvent event)
如果 return true,事件会分发给当前 View 并由 dispatchTouchEvent 方法进行处理,同时事件会停止向下传递;
如果 return false,事件分发分为两种情况:
如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent 进行消费;
如果当前 View 获取的事件来自外层父控件,则会将事件返回给父 View 的 onTouchEvent 进行消费。
如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。
onInterceptTouchEvent 拦截事件(只有ViewGroup有)
public boolean onInterceptTouchEvent(MotionEvent ev)
返回true 拦截 ;false 不拦截
如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理;
如果 onInterceptTouchEvent 返回 false,则表示将事件放行,当前 View 上的事件会被传递到子 View 上,再由子 View 的 dispatchTouchEvent 来开始这个事件的分发;
如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默认会被拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理。
onTouchEvent 处理事件
public boolean onTouchEvent(MotionEvent event)
返回true 自己处理 ;false传递给下一个处理
该方法的返回值是提供给dispatchTouchEvent()的返回值
ViewGroup中的事件处理的发放
/***分发事件* @param event 事件*/
@Override
public boolean dispatchTrackballEvent(MotionEvent event) {return super.dispatchTrackballEvent(event);
}/***拦截事件* @param event 事件* @return 返回true 拦截 ;false 不拦截*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {Log.d(TAG, "是否拦截");//让viewDragHelper帮主我们判断是否应该拦截return viewDragHelper.shouldInterceptTouchEvent(ev);
}/***处理事件* @param event 事件* @return 返回true 自己处理 ;false传递给下一个处理*/
@Override
public boolean onTouchEvent(MotionEvent event) {Log.d(TAG, "onTouchEvent");//让ViewDragHelper帮主我们处理触摸事件viewDragHelper.processTouchEvent(event);return true;
}
事件的分类
Android使用MotionEvent对于触摸事件进行描述
事件分类
- 按下
- 移动
- 弹起
事件传递的原则
- 按下事件一定要传递到最底层
- 那一层没有处理按下事件,其他的事件也不会传递进该层(只针对控件,不针对Activity)
- Activity、Viewgroup、View默认本身是不会处理任何事件的
点击事件一定要强制传递到最底层,不然子控件请求父控件不要拦截方法执行不到
效果处理放置在onTouchEvent()
子控件请求父控件不要拦截事件
就是在MyView层的dispatchTouchEvent方法中请求父控件不要拦截
事件拦截的代码应该写在哪里?
如果ViewGroup要拦截事件,拦截的逻辑处理放置在onInterceptTouchEvent()
Android中事件的传递相关推荐
- android post json格式,Android中post请求传递json数据给服务端的实例
在最近的项目中有个需求是这样的: 入参封装成JSON,EXAMPLE: { "uuid": "iamauuid","clientType": ...
- android json传输数据到服务器,Android中post请求传递json数据给服务端的实例
在最近的项目中有个需求是这样的: 入参封装成JSON,EXAMPLE: { "uuid": "iamauuid", "clientType" ...
- Android中事件传递机制的总结
事件传递虽然算不上某个单独的知识点,但是在实际项目开发中肯定会碰到,如果不明白其中的原理,那在设计各种滑动效果时就会感到很困惑. 关于事件的传递,我们可能会有以下疑问: 事件是如何传递的 事件是如何处 ...
- Android中事件分发机制的总结
原文出处:http://blog.csdn.net/jdsjlzx/article/details/52355249 事件传递虽然算不上某个单独的知识点,但是在实际项目开发中肯定会碰到,如果不明白其中 ...
- Android中的数据传递之Parcelable接口
对于Android来说传递复杂类型,主要是将自己的类转换为基础的字节数组,Activity之间传递数据是通过Intent实现的. Android序列化对象主要有两种方法,实现Serializable接 ...
- iOS中事件的传递和响应者链条
在iOS 开发中,常见的事件有三种类型,分别是: (1)触摸事件:平常手指在屏幕上滑动,产生的事件都是触摸事件 (2)加速计事件:微信的摇一摇就是典型的加速计事件 (3)远程控制事件:耳机控制歌曲上一 ...
- 详解Android Touch事件的传递机制
1.基础知识 (1) 所有Touch事件都被封装成了MotionEvent对象,包括Touch的位置.时间.历史记录以及第几个手指(多指触摸)等. (2) 事件类型分为ACTION_DOWN, ACT ...
- android方向触摸事件,Android触摸事件如何传递?
慕工程0101907 让我们看一个视觉示例.在此处输入图片说明发生触摸事件时,首先会向每个人通知该事件,从活动开始,一直到顶部的视图.然后,每个人都有机会处理该事件,从顶部的视图(触摸区域中Z顺序最高 ...
- Android 中Touch(触屏)事件传递机制
版本:2.0 日期:2014.3.21 2014.3.29 版权:© 2014 kince 转载注明出处 一.基本概念 在实际开发中,经常会遇到与触屏事件有关的问题,最典型的一个就是滑动冲突.比如在使 ...
最新文章
- Android架构师教你如何突破瓶颈,快来收藏!
- Unencrypted connection refused. Goodbye. Connection closed by foreign host.
- 014 怪物过滤的设计和实现
- 朝文夕拾系列II---横向型VS垂直型,我所知道的O2O
- js网页返回页面顶部的小方法
- tomcat,很多时候,可以在服务server.xml中可以实现一些效果
- cake php_如何(以及为什么)在Swinject中使用Cake Pattern
- screentogif 屏幕录制生成gif图片的软件安装过程
- VMware vSAN分布式存储安装配置
- jquery层级原则器(匹配前一个元素后的下一个元素,必须是挨着的)
- android 悬浮按钮出现隐藏,Android悬浮窗按钮实现点击并显示/隐藏多功能列表
- 一种用FFmpeg直接录屏并直播的方法
- android.view.WindowLeaked报错的解决方案
- Data-free量化
- 基于STM32设计的智慧浇花系统(华为云IOT)
- 极客时间所有课程返现海报集合
- shell脚本进入指定目录
- 共享局域网与交换局域网
- How scalable is OpenVZ?
- Axure怎样制作内部框架
热门文章
- 威廉与玛丽学院读计算机博士,威廉与玛丽学院计算机科学(计算运算研究)理学硕士研究生申请要求及申请材料要求清单...
- linux send 失败_linux高性能网络编程之tcp连接的内存使用
- android自动化优化工具,一键自动优化系统大师下载
- 调查问卷_员工满意度调查问卷
- echarts前后端交互数据_如何避免前后端在数据交互方面的相爱相杀?
- Redis持久化存储详解(一)
- 使用navicat premium将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL
- Netflix发布Polly.JS,一个用于HTTP交互的开源库
- 正视CSS 08】巅峰对武之float你为什么要坍塌我的元素!!!
- vue绑定数据之前 会看到源代码