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中事件的传递相关推荐

  1. android post json格式,Android中post请求传递json数据给服务端的实例

    在最近的项目中有个需求是这样的: 入参封装成JSON,EXAMPLE: { "uuid": "iamauuid","clientType": ...

  2. android json传输数据到服务器,Android中post请求传递json数据给服务端的实例

    在最近的项目中有个需求是这样的: 入参封装成JSON,EXAMPLE: { "uuid": "iamauuid", "clientType" ...

  3. Android中事件传递机制的总结

    事件传递虽然算不上某个单独的知识点,但是在实际项目开发中肯定会碰到,如果不明白其中的原理,那在设计各种滑动效果时就会感到很困惑. 关于事件的传递,我们可能会有以下疑问: 事件是如何传递的 事件是如何处 ...

  4. Android中事件分发机制的总结

    原文出处:http://blog.csdn.net/jdsjlzx/article/details/52355249 事件传递虽然算不上某个单独的知识点,但是在实际项目开发中肯定会碰到,如果不明白其中 ...

  5. Android中的数据传递之Parcelable接口

    对于Android来说传递复杂类型,主要是将自己的类转换为基础的字节数组,Activity之间传递数据是通过Intent实现的. Android序列化对象主要有两种方法,实现Serializable接 ...

  6. iOS中事件的传递和响应者链条

    在iOS 开发中,常见的事件有三种类型,分别是: (1)触摸事件:平常手指在屏幕上滑动,产生的事件都是触摸事件 (2)加速计事件:微信的摇一摇就是典型的加速计事件 (3)远程控制事件:耳机控制歌曲上一 ...

  7. 详解Android Touch事件的传递机制

    1.基础知识 (1) 所有Touch事件都被封装成了MotionEvent对象,包括Touch的位置.时间.历史记录以及第几个手指(多指触摸)等. (2) 事件类型分为ACTION_DOWN, ACT ...

  8. android方向触摸事件,Android触摸事件如何传递?

    慕工程0101907 让我们看一个视觉示例.在此处输入图片说明发生触摸事件时,首先会向每个人通知该事件,从活动开始,一直到顶部的视图.然后,每个人都有机会处理该事件,从顶部的视图(触摸区域中Z顺序最高 ...

  9. Android 中Touch(触屏)事件传递机制

    版本:2.0 日期:2014.3.21 2014.3.29 版权:© 2014 kince 转载注明出处 一.基本概念 在实际开发中,经常会遇到与触屏事件有关的问题,最典型的一个就是滑动冲突.比如在使 ...

最新文章

  1. Android架构师教你如何突破瓶颈,快来收藏!
  2. Unencrypted connection refused. Goodbye. Connection closed by foreign host.
  3. 014 怪物过滤的设计和实现
  4. 朝文夕拾系列II---横向型VS垂直型,我所知道的O2O
  5. js网页返回页面顶部的小方法
  6. tomcat,很多时候,可以在服务server.xml中可以实现一些效果
  7. cake php_如何(以及为什么)在Swinject中使用Cake Pattern
  8. screentogif 屏幕录制生成gif图片的软件安装过程
  9. VMware vSAN分布式存储安装配置
  10. jquery层级原则器(匹配前一个元素后的下一个元素,必须是挨着的)
  11. android 悬浮按钮出现隐藏,Android悬浮窗按钮实现点击并显示/隐藏多功能列表
  12. 一种用FFmpeg直接录屏并直播的方法
  13. android.view.WindowLeaked报错的解决方案
  14. Data-free量化
  15. 基于STM32设计的智慧浇花系统(华为云IOT)
  16. 极客时间所有课程返现海报集合
  17. shell脚本进入指定目录
  18. 共享局域网与交换局域网
  19. How scalable is OpenVZ?
  20. Axure怎样制作内部框架

热门文章

  1. 威廉与玛丽学院读计算机博士,威廉与玛丽学院计算机科学(计算运算研究)理学硕士研究生申请要求及申请材料要求清单...
  2. linux send 失败_linux高性能网络编程之tcp连接的内存使用
  3. android自动化优化工具,一键自动优化系统大师下载
  4. 调查问卷_员工满意度调查问卷
  5. echarts前后端交互数据_如何避免前后端在数据交互方面的相爱相杀?
  6. Redis持久化存储详解(一)
  7. 使用navicat premium将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL
  8. Netflix发布Polly.JS,一个用于HTTP交互的开源库
  9. 正视CSS 08】巅峰对武之float你为什么要坍塌我的元素!!!
  10. vue绑定数据之前 会看到源代码