Touch 事件的传递机制

一个完整的touch 事件,由一个 down 事件、n 个 move 事件,一个 up 事件组成.

Touch 事 件 一 般 的 传 递 流 程

Activity-->window(唯一实现类是PhoneWindow)-->顶级View(DecorView)-->ViewGroup-->View

监 听 Touch 事 件 有 两 种 方 式 :

[方式1]setOnTouchListener
[方式2]直 接 重 写 三 个 方 法(dispatchTouchEvent、onInterceptTouchEvent()、onTouchEvent() )

触摸事件的两种方式.jpg

[0]首先补充onTouch () 与 onTouchEvent()的关系

onTouch 回调方法,监听touch事件,处理一些事件
onTouchEvent 处理触摸事件调用顺序:onTouch先调用, onTouchEvent后调用如果onTouch返回true, onTouchEvent就不会调用(参考View源码的dispatchTouchEvent的方法)
        伪代码:dispatchTouchEvent(){if( onTouch()){return true;}....//控件具有点击事件if(onTouchEvent()){switch case down/up/move等//up时调用performClick()来执行点击,回调点击监听onClick()等return true;}}

[1]setOnTouchListener//监 听 Touch 事 件 方 式 1

    该方式监听 Touch 事件,优先级较高,如果在 onTouchListener 的 onTouch 方法中 return true 的话,那么 onTouchEvent 方法是接收不到该 Touch 事件的。而且因为 onClickListener 中的 onClick 方法实际上是在 onTouchEvent 中被调用的,所以如果 Touch 事件走不到 onTouchEvent 方法的话,点击事件也不会生效

[2]重写的3个方法//监 听 Touch 事 件 方 式 2

    a)dispatchTouchEvent该方法表示对事件进行分发,在这个方法中我们一般return super.dispatchTouchEvent,将该事件分发下去。b)onInterceptTouchEvent:该方法表示对 Touch 事件进行拦截,该方法是ViewGroup 特有的,View 没有(当然是因为没有子View啦)。ViewGroup 中如果 onInterceptTouchEvent 返在回 true,表示将该事件拦截,那么事件将传递给该 ViewGroup 的 onTouchEvent方法来处理。如果 onInterceptTouchEvent 返回 false 表示不拦截,那么该事件将传递给子 View 的 dispatchTouchEvent 来进行分发。c)onTouchEvent:该方法表示对 Touch 事件进行消费,返回 true 表示消费,返回 false 表示不消费那么该事件将传递给父控件的 onTouchEvent 进行处理。1.dispatchTouchEvent 分发事件   2.onInterceptTouchEvent 拦截孩子的事件 //没有孩子就没有onInterceptTouchEvent()3.onTouchEvent 处理消费事件总结:[1]Android的事件分发是先传递到父控件(ViewGroup)--再有ViewGroup传递给View的,通过dispatchTouchEvent()方法.[2]在ViewGroup中可以通过onInterceptTouchEvent()方法对事件的传递进行拦截. 返回true拦截 ,false不拦截,默认是super(xxx)是false不拦截.[3]子View中如果将传递的事件消费掉,事件就不再向上传递,ViewGroup中就无法接收到任何事件子View消费:onTouchEvent() 返回true,事件不向上传递; 返回false,事件不消费,层层往上传递给父控件的onTouchEvent()事件.

Touch.jpg

Touch03.png

Touch02.jpg

Activity与事件传递

    Activity首先获取到事件 调用Activity的dispatchTouchEvent去分发事件将事件传递给Activity对应的PhoneWindow, phoneWindow继续将事件往下传递如果传递下去没有任何控件消费事件,则会调用Activity的onTouchEvent

Touch01.png

View点击事件的触发和拦截

    [1]点击事件的触发: 在View的onTouchEvent处理UP时会调用performClick()来执行点击,回调点击监听[2]点击事件的拦截: onInterceptTouchEvent 返回true

作者:KIMDA
链接:https://www.jianshu.com/p/42dfd6a27c61
来源:简书

Android 触摸事件(Touch)的传递机制相关推荐

  1. android触摸事件分发,Android 事件分发机制

    Android 事件分发机制一直让人头痛,之前也是面向 GitHub 编程得过且过.今天下定决心了解一下,以便后面自己定制 View 效果.Android 触摸事件有三个基本类型:ACTION_DOW ...

  2. Android触摸事件传递分析与实践

    设计UI时,亲爱的交互设计师们总会有一些天马行空的想法,大多数情况下原生的控件已不能支持这些"看似简单"的交互逻辑,需要继承ListView.ViewPager.ScrollVie ...

  3. 为了讲清楚Android触摸事件,我“拆了部手机”

    Android 是一个有用户界面(GUI)的操作系统,在它诞生之初,就是为带有触摸屏的手持设备准备的.作为提供给用户最重要的交互方式之一,了解触摸系统是怎么工作的,对于实际的项目开发有着非常大的帮助. ...

  4. Android触摸事件实现笔触画布

    任何View都有触摸事件,经常在自定义控件时重写setOnTouchListener 本篇通过手绘图片来讲述这个知识点 本篇分为三个等级:一览图: 直线 曲线 笔触 LEVEL1.png LEVEL2 ...

  5. android方向触摸事件,Android触摸事件传递机制,这一篇就够了

    整个触摸事件牵涉到的是,Activity,View,ViewGroup三者的传递机制. 这个触摸事件就是从外层往内层一层层的传递. 整个传递机制,分为3个步骤:分发,拦截,和消费. 1. 触摸事件的类 ...

  6. Android之Android触摸事件传递机制

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53431274 本文出自:[顾林海的博客] ##前言 关于Android ...

  7. Android Activity 和 ViewGroup中事件触发和传递机制

     在Android中,Activity和View都能接收触摸和按键事件,如果响应事件只需要在继承类里复写事件函数即可. 1.在只有Activity的情况: 1)Touch事件触发流程: 首先触发d ...

  8. android 触摸事件 控制,Android笔记:触摸事件的分析与总结----TouchEvent处理机制

    其他相关博文: Android中的事件类型分为按键事件和屏幕触摸事件.TouchEvent是屏幕触摸事件的基础事件,要深入了解屏幕触摸事件的处理机制,就必须掌握TouchEvent在整个触摸事件中的转 ...

  9. 【知识梳理1】Android触摸事件机制

    前言 随着科学技术的发展,智能手机早已成为我们当代人身边不可缺少的"伙伴"之中的一个,堪比对象女友.每天我们对着手机反复的做着点击.滑动操作,而手机则随着我们的操作给我们展示她的精 ...

最新文章

  1. 程序员下班回家,路上被拦......
  2. Linux下集群技术应用概述
  3. 一文了解结构体字节对齐
  4. 选购光纤交换机时需要注意光模块的哪些配置?
  5. ubuntu7.10中的apache的一些设置
  6. (转载)Mac系统下利用ADB命令连接android手机并进行文件操作
  7. PHPStorm 设置背景图片
  8. 关于打包测试环境,百度地图报 Bmap not undefined
  9. 解决edge浏览器中idm插件不能自动捕捉下载链接的问题
  10. matlab实现一维数组求平均函数
  11. -3dB带宽定义和理解
  12. LLC谐振电路(一) 整流电路总结
  13. python之selenium设置浏览器为手机模式(开发者模式)
  14. android 小米手机播放短小音频无声音问题
  15. 【4月比赛合集】19场可报名的「创新应用」和「程序设计」大奖赛,任君挑选!
  16. 互联网创新影院:5G有手机的地方就有电影院
  17. hadoop和spark安装包 网盘地址
  18. Iphone幻灯片效果+背景音乐
  19. 【Pygame小游戏】“史上最炫酷贪吃蛇”驾到,FUN开玩(不好玩不要钱)
  20. 使用 SQL Server 创建唯一索引

热门文章

  1. “骚操作”男子看涩情直播打赏3千后报警,多个直播平台窝点被端!
  2. android 复制 粘贴 功能实现
  3. Cluste 模式下 Log4js 日志丢失
  4. 第一次放生,感觉很奇妙
  5. Linux网卡驱动程序在哪里?
  6. 晒晒我历年双十一的清单!
  7. JUC-Synchronized相关内容
  8. python实现大乐透号码生成器
  9. Windows Terminal 美化教程
  10. ROS-RouterOS hAP ac2+usb 4G上网卡+小米新推的无线上网卡是绝配