Android 触摸事件(Touch)的传递机制
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)的传递机制相关推荐
- android触摸事件分发,Android 事件分发机制
Android 事件分发机制一直让人头痛,之前也是面向 GitHub 编程得过且过.今天下定决心了解一下,以便后面自己定制 View 效果.Android 触摸事件有三个基本类型:ACTION_DOW ...
- Android触摸事件传递分析与实践
设计UI时,亲爱的交互设计师们总会有一些天马行空的想法,大多数情况下原生的控件已不能支持这些"看似简单"的交互逻辑,需要继承ListView.ViewPager.ScrollVie ...
- 为了讲清楚Android触摸事件,我“拆了部手机”
Android 是一个有用户界面(GUI)的操作系统,在它诞生之初,就是为带有触摸屏的手持设备准备的.作为提供给用户最重要的交互方式之一,了解触摸系统是怎么工作的,对于实际的项目开发有着非常大的帮助. ...
- Android触摸事件实现笔触画布
任何View都有触摸事件,经常在自定义控件时重写setOnTouchListener 本篇通过手绘图片来讲述这个知识点 本篇分为三个等级:一览图: 直线 曲线 笔触 LEVEL1.png LEVEL2 ...
- android方向触摸事件,Android触摸事件传递机制,这一篇就够了
整个触摸事件牵涉到的是,Activity,View,ViewGroup三者的传递机制. 这个触摸事件就是从外层往内层一层层的传递. 整个传递机制,分为3个步骤:分发,拦截,和消费. 1. 触摸事件的类 ...
- Android之Android触摸事件传递机制
转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53431274 本文出自:[顾林海的博客] ##前言 关于Android ...
- Android Activity 和 ViewGroup中事件触发和传递机制
在Android中,Activity和View都能接收触摸和按键事件,如果响应事件只需要在继承类里复写事件函数即可. 1.在只有Activity的情况: 1)Touch事件触发流程: 首先触发d ...
- android 触摸事件 控制,Android笔记:触摸事件的分析与总结----TouchEvent处理机制
其他相关博文: Android中的事件类型分为按键事件和屏幕触摸事件.TouchEvent是屏幕触摸事件的基础事件,要深入了解屏幕触摸事件的处理机制,就必须掌握TouchEvent在整个触摸事件中的转 ...
- 【知识梳理1】Android触摸事件机制
前言 随着科学技术的发展,智能手机早已成为我们当代人身边不可缺少的"伙伴"之中的一个,堪比对象女友.每天我们对着手机反复的做着点击.滑动操作,而手机则随着我们的操作给我们展示她的精 ...
最新文章
- 程序员下班回家,路上被拦......
- Linux下集群技术应用概述
- 一文了解结构体字节对齐
- 选购光纤交换机时需要注意光模块的哪些配置?
- ubuntu7.10中的apache的一些设置
- (转载)Mac系统下利用ADB命令连接android手机并进行文件操作
- PHPStorm 设置背景图片
- 关于打包测试环境,百度地图报 Bmap not undefined
- 解决edge浏览器中idm插件不能自动捕捉下载链接的问题
- matlab实现一维数组求平均函数
- -3dB带宽定义和理解
- LLC谐振电路(一) 整流电路总结
- python之selenium设置浏览器为手机模式(开发者模式)
- android 小米手机播放短小音频无声音问题
- 【4月比赛合集】19场可报名的「创新应用」和「程序设计」大奖赛,任君挑选!
- 互联网创新影院:5G有手机的地方就有电影院
- hadoop和spark安装包 网盘地址
- Iphone幻灯片效果+背景音乐
- 【Pygame小游戏】“史上最炫酷贪吃蛇”驾到,FUN开玩(不好玩不要钱)
- 使用 SQL Server 创建唯一索引