一、事件分发机制流程图

当点击view的时候,最先响应的是它的父容器viewGroup,执行事件分发dispatchTouchEvent(MotionEvent e),在这个方法的内部会走它自身的onInterceptTouchEvent(MotionEvent e)进行事件拦截判断,如果该方法返回值为true(进行拦截),则该事件不会传递给它的子view,会走到viewGroup的onTouchEvent(MotionEvent e)事件;如果该方法返回为false(不进行拦截),则会传递给子view,子view的dispatchTouchEvent(MotionEvent e)方法执行,因为子view没有孩子,所以它没有onInterceptTouchEvent(MotionEvent e)拦截方法,而是直接走到onTouchEvent(MotionEvent e)事件,返回true,则表明消费该事件,父容器viewGroup的onTouchEvent(MotionEvent e)不会执行;如果子view的onTouchEvent(MotionEvent e)事件返回false,则表明不消费该事件,往上抛给它的父容器viewGroup,父容器的onTouchEvent(MotionEvent e)事件会执行。以此类推,树状结果,从根部开始往下遍历,走到子view的onTouchEvent(MotionEvent e),根据它的返回结果,反馈给它的父容器。

上述流程中有关onTouch(View v, MotionEvent event)和onClick()方法进行说明:

  • 如果View或者ViewGroup设置了View.OnTouchListener()事件,则在执行onTouchEvent(MotionEvent event)之前会执行onTouch(View v, MotionEvent event)方法,它的返回结果决定onTouchEvent(MotionEvent event)是否执行,返回false,则执行onTouchEvent(MotionEvent event);返回true,则不执行onTouchEvent(MotionEvent event)。

  • onClick()事件类似,前提是设置了View.OnClickListener()事件,且执行了performClick()事件,performClick()方法的执行依赖于onTouchEvent(MotionEvent event)方法的返回值,为true,则执行performClick();为false,则不执行performClick(),也就不会执行onClick()方法了。

二、View的滑动冲突

1.常见滑动冲突场景
  • 外部滑动方向与内部滑动方向不一致,比如ViewPager中包含ListView
  • 外部滑动方向与内部滑动方向一致,比如ScrollView中包含ListView
2.滑动冲突处理规则

通过判断是水平滑动还是竖直滑动来判断到底应该谁来拦截事件;可以根据水平和竖直两个方向的距离差或速度差来做判断。

3.滑动冲突解决方式?
  • 外部拦截法: 即点击事件先经过父容器的拦截处理,如果父容器需要此事件就拦截,不需要就不拦截,需要重写父容器的onInterceptTouchEvent方法;在onInterceptTouchEvent方法中,首先ACTION_DOWN这个事件,父容器必须返回false,即不拦截ACTION_DOWN事件,因为一旦父容器拦截了ACTION_DOWN,那么后续的ACTION_MOVE/ACTION_UP都会直接交给父容器处理;其次是ACTION_MOVE,根据需求来决定是否要拦截;最后ACTION_UP事件,这里必须要返回false,在这里没有多大意义。
  • 内部拦截法: 所有事件都传递给子元素,如果子元素需要就消耗掉,不需要就交给父元素处理,需要子元素配合requestDisallowInterceptTouchEvent方法才能正常工作;父元素需要默认拦截除ACTION_DOWN以外的事件,这样子元素调用parent.requestDisallowInterceptTouchEvent(false)方法时,父元素才能继续拦截需要的事件。(ACTION_DOWN事件不受requestDisallowInterceptTouchEvent方法影响,所以一旦父元素拦截ACTION_DOWN事件,那么所有元素都无法传递到子元素去)。

Android事件分发原理相关推荐

  1. 一张图看懂android事件分发原理

    废话不多说,直接上图 图解:android中事件分发的起始点是Activity,有Activity里的Detorview通过DispatchTouchEvent开始分发,如图假设一个DOWN,MOVE ...

  2. 【Android 事件分发】ItemTouchHelper 事件分发源码分析 ( 绑定 RecyclerView )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

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

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

  4. 《Android深入透析》之Android事件分发机制

    <Android深入透析>之Android事件分发机制 <Android深入透析>之Android事件分发机制 一.      Android分发机制概述: Android如此 ...

  5. Android事件分发-来龙去脉

    文章目录 情境(Situation) 冲突(Complication) 疑问(Question) 答案(Answer) 剖析 论点 约法三章 点 论据 人机交互 View树 类图 注释 DecorVi ...

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

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

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

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

  8. Android 事件分发 简单学

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

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

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

最新文章

  1. javascript 深度克隆对象
  2. Spring事务原理,Java开发岗还不会这些问题
  3. Eclipse 浏览(Navigate)菜单
  4. 手写一个promise用法_手写一个自己的 JavaScript Promise 类库
  5. Mysql 如何做双机热备和负载均衡 (方法一)
  6. 为了面试能通过,我要看完这75道面试题(下)
  7. Spire.XLS:一款Excel处理神器(2)
  8. python基础编程简单案例:购买商品
  9. 【reverse】2021 极客大挑战(部分)
  10. 如何单步调试存储过程
  11. 测绘工程本科生如何入门GNSS算法 - 引言
  12. java计算机毕业设计在线影视系统源码+数据库+lw文档+系统+部署
  13. “创意云”大规模在线创作服务平台
  14. jQuery学习小征途
  15. C++ 类的静态成员及静态成员函数
  16. 了解JavaScript中的Promise
  17. 尺规虽设,犹奈“度”何
  18. CSV百字段Oracle建表的身不由己迫不得已解决方案——拼音
  19. Win10回收站清空了怎么恢复?3个简单高效的方法
  20. vue项目使用腾讯地图获取定位

热门文章

  1. MPLS之LDP协议
  2. 笔记本 原因代码: 0x500ff 关机类型: 关闭电源_关于笔记本电池更换的建议
  3. 余弦s=Acos(wt+φ)
  4. css规则定义的分类,CSS规则定义英汉对照表
  5. WPTools改进了光标定位算法和RTF编写器
  6. 计算机专硕_2021年北京科技大学计算机专硕考研初复试考研经验分享、择校备考分析指导...
  7. 【高级数理统计R语言学习】9 无序多分类分析
  8. 关于jupyter的故障重启(学习笔记)
  9. Python实现手机号自动判断男女性别
  10. GitLab使用手册