简单的讨论下关于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事件分发简单介绍相关推荐

  1. Android 事件分发 简单学

    为什么80%的码农都做不了架构师?>>>    本文地址:https://my.oschina.net/lifj/blog/1928132 Android 事件分发过程 网上有很多这 ...

  2. 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...

  3. Android事件分发机制:基础篇:最全面、最易懂

    如何提升安卓水平?安卓开发者必须了解的事件分发机制. 最全面.最易懂的形式来讲解Android事件分发机制. 0. 前言 鉴于安卓分发机制较为复杂,故分为多个层次进行讲解,分别为基础篇.实践篇与高级篇 ...

  4. Android 系统(199)---Android事件分发机制详解

    Android事件分发机制详解 前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析. ...

  5. android系统(8)---android事件分发机制

    前言 Android事件分发机制是每个Android开发者必须了解的基础知识 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析.简单问题复杂化等等 今天 ...

  6. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发机制...

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

  7. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

  8. Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

    <div id="container">         <div id="header">     <div class=&qu ...

  9. View的事件体系之三 android事件分发机制详解(下)

    接着上一篇来分析事件分发机制,在看了各位大牛的关于事件分发机制的分析后茅塞顿开,之前看过好几遍郭霖,弘扬以及玉刚大神关于事件体系的讲解,一直看不懂,比较模糊,最近复习时,看到一篇博文,写的相当精彩,看 ...

最新文章

  1. 纠正网上流传的SQL取某一时间的当月第一天和最后一天的时间写法
  2. 情人节特效.羞答答的玫瑰静悄悄的开效果....
  3. 妲己机器人怎么升级固件_台湾重金设计的3D妲己,亮瞎了
  4. Scintilla 3 24在MFC中的使用 动态 静态
  5. 蓝桥杯 算法训练 区间k大数查询
  6. python比较长度_Python:XLRD;比较列长度
  7. 又一程序员删库跑路,只不过他没跑掉,还被抓了~
  8. win10自动停用打印服务器,雨林木风win10系统添加打印机总是自动关闭打印服务的方法...
  9. MySQL:数据库练习题-3
  10. 新时期文学专题研究【1】
  11. 吴若权——洛可可动画电影馆
  12. fastq与fasta文件格式解析
  13. iosetup mysql_InnoDB: Error: io_setup() failed with EAGAIN
  14. 2022中国人力资源管理年度观察
  15. TSMaster快速入门篇(2)-报文回放
  16. VS中使用BugTrap定位程序崩溃点
  17. 电脑一打开wps就黑屏_打开电脑,显示器黑屏该如何解决?
  18. 摆摊卖网红气球怎么样?
  19. ​​​​​​​人工智能的应用,人工智能的未来趋势
  20. java 创建子类_怎么建立java子类

热门文章

  1. (2020.9.28)面试记录:软件测试实习生--面试记录
  2. 如何采集小红书最新版(2018年9月)数据
  3. 车企围攻整车OS,这张“新王牌”怎么打?
  4. win10 系统不显示机械硬盘(装在光驱位置)
  5. 韦东山freeRTOS系列教程之【第二章】内存管理
  6. 基于微信小程序的宠物医院诊所小程序源码
  7. linux-使用screen后台运行命令,防止断网导致异常退出,命令没运行完成
  8. 机器学习入门系列05,Classification: Probabilistic Generative Model(分类:概率生成模型)
  9. NFT“MetaBunny”公开发售后飙升近35倍 首轮公开发售1000枚后结束
  10. ZZULIOJ 1055兔子繁殖问题