Android事件分发简单介绍
简单的讨论下关于Android的事件分发,其实网上的介绍很多,但是每次看完我都记的很晕,而我也只想知道当不同的返回值事件走的流程,所以这也只为自己做个简单的记录
首先说一下关于事件分发ViewGroup和View对应的方法
ViewGroup:dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent、
View:dispatchTouchEvent、onTouchEvent
再定义了两个类GroupTest继承于LinearLayout(ViewGroup)和ButtonTest继承于Buttom(View),界面布局:
<com.mmf.ibinderdemo.GroupTestandroid:id="@+id/lyt_test"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><com.mmf.ibinderdemo.ButtonTestandroid:id="@+id/btn_test"android:layout_width="match_parent"android:layout_height="48dp"android:text="click"/></com.mmf.ibinderdemo.GroupTest>
一、事件拦截
onInterceptTouchEvent(MotionEvent ev)方法
从上面可以看出这个方法只有ViewGroup有,作用是拦截事件向下传递,啥意思呢,就是当你的ViewGroup中有子控件,而在onInterceptTouchEvent被拦截了,那么你的子控价就收不到touch事件,我们从代码中来看这个效果
在GroupTest复写事件分发的三个方法
@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev){super.onInterceptTouchEvent(ev);Log.e("Touch = ", "group onInterceptTouchEvent "+ ev.getAction() );return true;}@Overridepublic boolean onTouchEvent(MotionEvent event) {Log.e("Touch = ", "group onTouchEvent "+ event.getAction() );return super.onTouchEvent(event);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {boolean dispatchTouch = super.dispatchTouchEvent(ev);Log.e("Touch = ", "group dispatchTouchEvent + " +dispatchTouch +ev.getAction());return dispatchTouch;}
ButtonTest复写
@Overridepublic boolean onTouchEvent(MotionEvent event) {Log.e("Touch = ", "chile touch");return super.onTouchEvent(event);}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {Log.e("Touch = ", "chile dispatchTouchEvent");return super.dispatchTouchEvent(event);}
当onInterceptTouchEvent返回true时查看运行结果
10-20 05:17:13.207 8138-8138/com.mmf.ibinderdemo E/Touch =: group onInterceptTouchEvent 0
10-20 05:17:13.208 8138-8138/com.mmf.ibinderdemo E/Touch =: group onTouchEvent 0
10-20 05:17:13.208 8138-8138/com.mmf.ibinderdemo E/Touch =: group dispatchTouchEvent + true0
10-20 05:17:13.302 8138-8138/com.mmf.ibinderdemo E/Touch =: group onTouchEvent 1
10-20 05:17:13.302 8138-8138/com.mmf.ibinderdemo E/Touch =: group dispatchTouchEvent + true1
10-20 05:17:13.303 8138-8138/com.mmf.ibinderdemo E/MainActivity: lyt_test: grouptrue
当onInterceptTouchEvent返回false时查看运行结果
10-20 05:28:46.053 8362-8362/com.mmf.ibinderdemo E/Touch =: group onInterceptTouchEvent 0
10-20 05:28:46.053 8362-8362/com.mmf.ibinderdemo E/Touch =: chile dispatchTouchEvent
10-20 05:28:46.053 8362-8362/com.mmf.ibinderdemo E/Touch =: chile onTouchEvent
10-20 05:28:46.053 8362-8362/com.mmf.ibinderdemo E/Touch =: group dispatchTouchEvent + true0
10-20 05:28:46.183 8362-8362/com.mmf.ibinderdemo E/Touch =: group onInterceptTouchEvent 1
10-20 05:28:46.183 8362-8362/com.mmf.ibinderdemo E/Touch =: chile dispatchTouchEvent
10-20 05:28:46.183 8362-8362/com.mmf.ibinderdemo E/Touch =: chile onTouchEvent
10-20 05:28:46.183 8362-8362/com.mmf.ibinderdemo E/Touch =: group dispatchTouchEvent + true1
10-20 05:28:46.185 8362-8362/com.mmf.ibinderdemo E/MainActivity: btn_test: chiletrue
从以上结果可以看出当onInterceptTouchEvent返回true时会拦截事件的分发,子view接收不到事件,不执行onTouchEvent事件
如果返回 false,则表示不会拦截该事件,事件会被传递到子 View 上,执行onTouchEvent事件
二、事件消费
onTouchEvent(MotionEvent ev)这个方法就是用来处理具体点击事件的,它是在dispatchTouchEvent方法中调用
它的返回值表示是否消费当前事件,也就是是否响应当前事件,具体逻辑如下:
如果return true 则会接收并消费该事件。
如果return false,那么这个事件会向上传递,并由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 还是返回 false,这个事件无效,且接收不到下一次事件。什么意思呢,我们来看一下运行效果,将ButtonTest的onTouchEvent方法设置返回false,其他的保持原本状态
@Overridepublic boolean onTouchEvent(MotionEvent event) {super.onTouchEvent(event);Log.e("Touch = ", "chile onTouchEvent = " + event.getAction());return false;}
执行结果
10-20 07:29:57.526 10182-10182/com.mmf.ibinderdemo E/Touch =: group onInterceptTouchEvent 0
10-20 07:29:57.526 10182-10182/com.mmf.ibinderdemo E/Touch =: chile dispatchTouchEvent
10-20 07:29:57.526 10182-10182/com.mmf.ibinderdemo E/Touch =: chile onTouchEvent = 0
10-20 07:29:57.526 10182-10182/com.mmf.ibinderdemo E/Touch =: group onTouchEvent 0
10-20 07:29:57.526 10182-10182/com.mmf.ibinderdemo E/Touch =: group dispatchTouchEvent + true0
10-20 07:29:57.643 10182-10182/com.mmf.ibinderdemo E/Touch =: group onTouchEvent 1
10-20 07:29:57.643 10182-10182/com.mmf.ibinderdemo E/Touch =: group dispatchTouchEvent + true1
10-20 07:29:57.643 10182-10182/com.mmf.ibinderdemo E/MainActivity: lyt_test: grouptrue
将ButtonTest的onTouchEvent方法设置返回true,其他的保持原本状态
@Overridepublic boolean onTouchEvent(MotionEvent event) {super.onTouchEvent(event);Log.e("Touch = ", "chile onTouchEvent = " + event.getAction());return true;}
执行结果
10-20 07:28:25.021 10118-10118/? E/libprocessgroup: failed to make and chown /acct/uid_10066: Read-only file system
10-20 07:28:34.403 10118-10118/com.mmf.ibinderdemo E/Touch =: group onInterceptTouchEvent 0
10-20 07:28:34.403 10118-10118/com.mmf.ibinderdemo E/Touch =: chile dispatchTouchEvent
10-20 07:28:34.403 10118-10118/com.mmf.ibinderdemo E/Touch =: chile onTouchEvent = 0
10-20 07:28:34.403 10118-10118/com.mmf.ibinderdemo E/Touch =: group dispatchTouchEvent + true0
10-20 07:28:34.530 10118-10118/com.mmf.ibinderdemo E/Touch =: group onInterceptTouchEvent 1
10-20 07:28:34.530 10118-10118/com.mmf.ibinderdemo E/Touch =: chile dispatchTouchEvent
10-20 07:28:34.530 10118-10118/com.mmf.ibinderdemo E/Touch =: chile onTouchEvent = 1
10-20 07:28:34.530 10118-10118/com.mmf.ibinderdemo E/Touch =: group dispatchTouchEvent + true1
10-20 07:28:34.531 10118-10118/com.mmf.ibinderdemo E/MainActivity: btn_test: chiletrue
从结果上看,当返回false时,ButtonTest的onTouchEvent方式只执行了一次down的事件,别的事件都不再执行,且GroupTest消费了事件
当返回true时,表示该事件被这个ButtonTest消费了,GroupTest都没听调过onTouchEvent方法,因为事件被消费不再向上传递
ps:事件对应的值
MotionEvent.ACTION_DOWN = 0
MotionEvent.ACTION_MOVE = 2
MotionEvent.ACTION_UP = 1
三、事件分发
dispatchTouchEvent(MotionEvent ev)
竟然最后一个说事件分发,顺序跟事件步骤相反,因为我觉得如果事件拦截和事件消费大概流程懂了,事件分发就会更好理解
Android事件分发简单介绍相关推荐
- Android 事件分发 简单学
为什么80%的码农都做不了架构师?>>> 本文地址:https://my.oschina.net/lifj/blog/1928132 Android 事件分发过程 网上有很多这 ...
- 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...
- Android事件分发机制:基础篇:最全面、最易懂
如何提升安卓水平?安卓开发者必须了解的事件分发机制. 最全面.最易懂的形式来讲解Android事件分发机制. 0. 前言 鉴于安卓分发机制较为复杂,故分为多个层次进行讲解,分别为基础篇.实践篇与高级篇 ...
- Android 系统(199)---Android事件分发机制详解
Android事件分发机制详解 前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析. ...
- android系统(8)---android事件分发机制
前言 Android事件分发机制是每个Android开发者必须了解的基础知识 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析.简单问题复杂化等等 今天 ...
- 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发机制...
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...
- 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
<div id="container"> <div id="header"> <div class=&qu ...
- View的事件体系之三 android事件分发机制详解(下)
接着上一篇来分析事件分发机制,在看了各位大牛的关于事件分发机制的分析后茅塞顿开,之前看过好几遍郭霖,弘扬以及玉刚大神关于事件体系的讲解,一直看不懂,比较模糊,最近复习时,看到一篇博文,写的相当精彩,看 ...
最新文章
- 纠正网上流传的SQL取某一时间的当月第一天和最后一天的时间写法
- 情人节特效.羞答答的玫瑰静悄悄的开效果....
- 妲己机器人怎么升级固件_台湾重金设计的3D妲己,亮瞎了
- Scintilla 3 24在MFC中的使用 动态 静态
- 蓝桥杯 算法训练 区间k大数查询
- python比较长度_Python:XLRD;比较列长度
- 又一程序员删库跑路,只不过他没跑掉,还被抓了~
- win10自动停用打印服务器,雨林木风win10系统添加打印机总是自动关闭打印服务的方法...
- MySQL:数据库练习题-3
- 新时期文学专题研究【1】
- 吴若权——洛可可动画电影馆
- fastq与fasta文件格式解析
- iosetup mysql_InnoDB: Error: io_setup() failed with EAGAIN
- 2022中国人力资源管理年度观察
- TSMaster快速入门篇(2)-报文回放
- VS中使用BugTrap定位程序崩溃点
- 电脑一打开wps就黑屏_打开电脑,显示器黑屏该如何解决?
- 摆摊卖网红气球怎么样?
- ​​​​​​​人工智能的应用,人工智能的未来趋势
- java 创建子类_怎么建立java子类
热门文章
- (2020.9.28)面试记录:软件测试实习生--面试记录
- 如何采集小红书最新版(2018年9月)数据
- 车企围攻整车OS,这张“新王牌”怎么打?
- win10 系统不显示机械硬盘(装在光驱位置)
- 韦东山freeRTOS系列教程之【第二章】内存管理
- 基于微信小程序的宠物医院诊所小程序源码
- linux-使用screen后台运行命令,防止断网导致异常退出,命令没运行完成
- 机器学习入门系列05,Classification: Probabilistic Generative Model(分类:概率生成模型)
- NFT“MetaBunny”公开发售后飙升近35倍 首轮公开发售1000枚后结束
- ZZULIOJ 1055兔子繁殖问题