谈到View事件分发,相信大家都不陌生,我也自己琢磨了一下事件分发机制,从源码分析,提取了关键的步骤,并做小小的总结。
主要相关的类与方法为:
ViewGroup:
dispatchTouchEvent()
onInterceptTouchEvent()
onTouchEvent()

View:
dispatchTouchEvent()
onTouchEvent()

整体的思想可以概括为:

public boolean dispatchTouchEvent(){boolean consume = false;if(onInterceptTouchEvent()){cousume = onTouchEvent();}else{consume = child.dispatchTouchEvent();}return consume;
}

先看整体流程图:


修正补充@2016年6月27日:
经@wangmengdeboke 的指出,左下角部分的图需要做点改动,如下图所示:

正如补充的,这个disable状态也是蛮重要的,非常感谢@wangmengdeboke的指正。


  1. activity事件分发
    在图的左上角,是activity的事件分发,实际是调用DecorView的dispatchTouchEvent来进行的,而DecorView是继承自FrameLayout的类,其实算是最外层的viewGroup,当事件传递到viewGroup,就进入到右边分支判断。
  2. ViewGroup的事件分发
    一般情况下,如果不对onInterceptTouchEvent与disallowIntercept进行处理,就会对viewGroup中的childView进行处理,所以这里可以通过人为干预达到拦截事件分发的效果,但值得注意的是不能够拦截down事件,因为一旦拦截,则在onInterceptTouchEvent中不会接收到up与move事件,即这些事件直接被该viewGroup处理了。
  3. View的事件分发
    当事件分发到view后,会按序执行onTouch,onTouchEvent,onClick【如果有的话】,一旦有一者返回true消耗掉事件,则后者都不会响应,这里的onTouchEvent,适合做相关的事件处理与执行工作。

总结:
每个手指的动作,都会触发down,up,move的操作,并引发一系列的事件分发,而且一旦拦截掉down,则所有的事件也会交由该控件处理。在自定义viewGroup与View中,我们可以在onTouchEvent里面对相关的手指动作做处理,而在ViewGroup中,可以根据需要在onInterceptTouchEvent拦截该拦截需要拦截的事件。在View中,也可以修改父容器disallowInterceptTouchEvent的值达到控制父容器事件分发的目的,不过需要注意的是,down事件一定注意不要被父容器拦截到。

View事件分发机制分析相关推荐

  1. View事件分发机制(源码分析篇)

    01.Android中事件分发顺序 1.1 事件分发的对象是谁 事件分发的对象是事件.注意,事件分发是向下传递的,也就是父到子的顺序. 当用户触摸屏幕时(View或ViewGroup派生的控件),将产 ...

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

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

  3. Android面试老生常谈的 View 事件分发机制,看这一篇就够了

    本文首发我的微信公众号:徐公,想成为一名优秀的 Android 开发者,需要一份完备的 知识体系,在这里,让我们一起成长,变得更好~. 在 Android 开发当中,View 的事件分发机制是一块很重 ...

  4. Android View 事件分发机制详解

    想必很多android开发者都遇到过手势冲突的情况,我们一般都是通过内部拦截和外部拦截法解决此类问题.要想搞明白原理就必须了解View的分发机制.在此之前我们先来了解一下以下三个非常重要的方法: di ...

  5. 一文读懂Android View事件分发机制

    Android View 虽然不是四大组件,但其并不比四大组件的地位低.而View的核心知识点事件分发机制则是不少刚入门同学的拦路虎.ScrollView嵌套RecyclerView(或者ListVi ...

  6. View事件分发机制(源码 API27)

    1.什么是事件分发机制 当用户触摸屏幕时,会产生一个touch事件,这个touch事件(motionEvent)传递到某个具体的view处理的整个过程 用户触摸屏幕会产生一个事件流(ACTION_DO ...

  7. 【Android View事件分发机制】关于拦截事件的注意点

    在父容器拦截事件时,为什么不能拦截DOWN事件呢? 先看看源码: 回顾一下事件分发机制原理,当事件来了之后,如果父容器不拦截,则会询问其child view ,当某child view 有事件需求,父 ...

  8. View事件分发机制

    一.概念 View可以说是Android中的第五大控件了,不管是Button还是TextView还是复杂的RelativeView,他们的共同基类都是View,View是界面层控件的一种抽象,View ...

  9. View 事件分发机制

    View 中的事件消息传递,是android的一个重点和难点,我们只有掌握了它,才能更好的理解view,写出自己比较满意的自定义控件,解决控件嵌套时产生的滑动冲突和点击事件失效问题. 我们知道 Vie ...

  10. 【Android View事件分发机制】滑动冲突

    View内容滑动概念 scrollTo scrollBy scrollTo(x,y) x,y 是绝对值,如果x,y不变,重复调用是不会移动的. scrollBy(x,y) x,y是增量之,每次调用都会 ...

最新文章

  1. hashmap::begin() 坑
  2. Java数据库查询简介
  3. Unity 编译apk启动出异常
  4. C库宏-offsetof()
  5. web 资源管理器相关产品
  6. selenium 使用js执行脚本儿链接整理
  7. 基于比较的排序算法集
  8. 解决异常:公共语言运行时检测到无效的程序
  9. 计算机829大纲,829计算机基础考试大纲
  10. 微信小程序商城模板平台分享
  11. OSEK网络管理入门
  12. 简单好用的Mac截图工具:FinalShot
  13. 手把手教你:基于深度学习的滚动轴承故障诊断
  14. 谷歌浏览器扩展程序XDM_这才是谷歌浏览器的正确打开方式,有效节省内存占用,流畅飞起...
  15. 移动端图片居多,加载过慢,使用延迟加载|懒加载( lazyload.js)
  16. 计算机可以调剂到资源与环境吗,资源与环境求调剂 - 考研 - 小木虫 - 学术 科研 互动社区...
  17. Oracle数据库账号密码设置
  18. 学习笔记:测试抓包工具fiddler
  19. 单例模式及单例类的两种实现
  20. centos7上mycat安装_centos7 Mycat/MySQL/MariaDB安装部署

热门文章

  1. 7大不跳槽就会死的理由!
  2. 教你简单3步搞定——微信快速添加个人表情包
  3. 各种主流浏览器的调试
  4. HDU4622: Reincarnation
  5. InnoDB下SQL执行底层原理和redolog、binlog
  6. voyage java_Voyage:采用Java实现的基于netty轻量的高性能分布式RPC服务框架
  7. Cat Snuke and a Voyage
  8. 【vn.py】SpreadTrading价差交易
  9. 2023秋招大厂经典面试题及答案整理归纳(101-120)校招必看
  10. 什么是单子?Java开发人员的基本理论