在Android实际开发过程中经常会遇到View之间的滑动冲突,如ScrollView与Listview、RecyclerView之间的嵌套使用。在很好的解决此类问题之前,我们应深入的了解Android事件响应机制。

1.事件响应机制的预备知识

在深入了解Android事件响应机制前,一些预备知识我们应该有所了解。

1.1 onTouch是优先于onClick执行,事件传递的顺序是先经过onTouch,再传递到onClick。

1.2 Android中的事件onClick、onLongClick、onScroll等,都是由多个Touch事件(一个ACTION_DOWN,多个ACTION_MOVE,一个ACTION_UP)组成。

1.3 Android事件响应机制是“由外到内”分发、“由内到外”处理的形式实现的。

1.4 MotionEvent对象的四种状态

MotionEvent.ACTION_DOWN:手指按下屏幕的瞬间。

MotionEvent.ACTION_MOVE:手指在屏幕上移动

MotionEvent.ACTION_UP:手指离开屏幕瞬间

MotionEvent.ACTION_CANCEL:取消手势

2.Android事件处理的三个重要函数

Android事件分发机制主要由“事件分发”—>“事件拦截”—>“事件响应”这三步来进行逻辑控制的。本文也将从这三步对应的函数来分析。

2.1 事件分发:public boolean dispatchTouchEvent(MotionEvent ev)

当监听到有触发事件时,首先由Activity进行捕获,然后事件就进入事件分发的流程。Activity本身没有事件拦截,从而将事件传递给最外层的View的dispatchTouchEvent(MotionEvent ev)方法,该方法将对事件进行分发。

  • return true : View消费所有事件。
  • return false :停止分发,交由上层控件的onTouchEvent方法进行消费,如果本层控件是Activity,那么事件将被系统消费、处理。
  • super.dispatchTouchEvent(ev): 将事件交由本层的事件拦截onInterceptTouchEvent方法处理。
2.2 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
  • return true: 对事件拦截,交由本层的onTouchEvent进行处理。
  • return false: 不拦截,分发到子View,由子View的dispatchTouchEvent方法处理。
  • super.onInterceptTouchEvent(ev):默认表示事件拦截,交由本层的onTouchEvent进行处理。
2.3 事件响应:public boolean onTouchEvent(MotionEvent ev)
  • return true: 表示onTouchEvent处理完事件后消费了此次事件。
  • return false: 不响应事件,不断的传递给上层的onTouchEvent方法处理,直到某个View的onTouchEvent返回true,则认为该事件被消费。如果到最顶层View还是返回false,那么该事件不消费,将交由Activity的onTouchEvent进行处理。
  • return: super.onTouchEvent,不响应事件,结果与return返回false一样。

综上所述,我们可以总结出如下流程图:

结合上面的理解,我们再来看看Touch事件传递机制流程图

3. 总结

通过上面的叙述,相信大家对Android的分发机制有了初步的理解。为了加深大家的理解,下面做个简单的总结。

  1. ViewGroup默认不拦截任何事件。
  2. 点击事件的分发过程如下:dispatchTouchEvent—>onTouchListener的OnTouch方法—>onTouchEvent—>onClickListener的onClick方法。从而也可以看出onTouch优先于onClick执行。
  3. 子View可以通过使用getParent().requestDisallowInterceptTouchEvent(true),阻止ViewGroup对其MOVE或UP事件进行拦截。
  4. 一个点击事件产生后,传递过程是:Activity—>Window—>View。顶级View接受到事件后,就会按照上面的规则去分发事件。

好了,本文到此结束。以上仅是个人对Android事件分发机制的粗略理解,如有不足之处,还望指正。如果大家想进一步的结合源码深入了解,建议大家可以再看看郭霖的这篇文章http://blog.csdn.net/guolin_blog/article/details/9097463/

浅谈Android事件分发机制相关推荐

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

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

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

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

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

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

  4. Android 事件分发机制

    Android 事件分发机制  demo验证:  https://blog.csdn.net/hty1053240123/article/details/77866302 目录 1.基础认知 2.事件 ...

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

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

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

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

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

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

  8. 一篇文章彻底搞懂Android事件分发机制

    本文讲的是一篇文章彻底搞懂Android事件分发机制,在android开发中会经常遇到滑动冲突(比如ScrollView或是SliddingMenu与ListView的嵌套)的问题,需要我们深入的了解 ...

  9. Android 事件分发机制分析及源码详解

    Android 事件分发机制分析及源码详解 文章目录 Android 事件分发机制分析及源码详解 事件的定义 事件分发序列模型 分发序列 分发模型 事件分发对象及相关方法 源码分析 事件分发总结 一般 ...

最新文章

  1. beego api mysql_beego搭建api服务
  2. C语言十六进制转八进制(附完整源码)
  3. e2fsprogs制作嵌入式 mkfs.ext2 mkfs.ext3 mkfs.ext4
  4. Hdu1232 畅通工程 【并查集】
  5. 前端学习(1603):脚手架组件使用
  6. java kill 线程_java – 如何在等待中杀死正在运行的线程?
  7. Hdu 1496 Equations
  8. html5 响应式背景图
  9. bll调用mysql存储过程_SQL Server的存储过程或自定义函数调用Com组件
  10. 解决Win10 PowerShell无法激活Anaconda环境的问题
  11. File Finder pro Mac版重复文件查找器使用方法
  12. 完工后的决算书范本_工程竣工结算书格式
  13. CMAKE Opencv配置
  14. JDK7升级到JDK8
  15. 罗技 无线鼠标 USB HID数据格式
  16. python加减乘除运算代码_四则运算python版
  17. Objective-C仿映客跑车动画
  18. xmind收费与免费的区别_十年了,我终于想明白免费跟付费的区别
  19. 安卓快速入门系列1(通过插件使用java8的语法)
  20. mysql 1044 42000_解决WDCP面板导入数据库出现ERROR 1044 (42000)错误问题

热门文章

  1. Tensorflow2.0 + Transformers 实现Bert FGM对抗训练惩罚梯度损失函数
  2. AI圈最新深度学习量化算法!
  3. 炼丹笔记 | 讲讲我们的故事
  4. 打造云上金融!网易云信入选「2021 数字化转型最佳案例 Top10」
  5. 互联网1分钟 | 1009
  6. 一步搞清楚多态与类初始化的底层原理
  7. Oracle PL/SQL中如何使用%TYPE和%ROWTYPE
  8. JS实现html国际化二
  9. 【.Net Micro Framework PortingKit - 08】GPIO驱动
  10. flex vue 垂直居中居上_移动开发-flex 布局