Android面试必问之触摸事件传递机制

  • 一、Activity的构成
  • 二、触摸事件的类型
  • 三、事件传递的三个阶段
  • Activity对点击事件的分发过程
  • 五、View的事件分发机制
  • 六、点击事件分发的传递规则

一、Activity的构成

一个Activity包含了一个Window对象,这个对象是由PhoneWindow来实现的。PhoneWindow将DecorView作为整个应用窗口的根View,而这个DecorView又将屏幕划分为两个区域:一个是TitleView,另一个是ContentView,而我们平时所写的就是展示在ContentView中的。

二、触摸事件的类型

MotionEvent类,主要有三种事件类型:

  • ACTION_DOWN
  • ACTION_MOVE
  • ACTION_UP

三、事件传递的三个阶段

  • dispatchTouchEvent(分发):返回true表示事件被当前视图消费,返回super.dispatchTouchEvent表示继续分发事件
  • onInterceptTouchEvent(拦截):返回true表示拦截事件并调用onTouchEvent方法消费;返回false表示不拦截,继续传递给子视图。如果return super.onInterceptTouchEvent,分情况:
  • onTouchEvent(消费):返回true表示当前视图处理该事件,返回false表示当前视图不处理事件,传递给父视图的onTouchEvent处理。如果return super.onTouchEvent,分情况:

    ps:在Android系统中,拥有事件传递能力的类有:
      1. Activity:拥有分发和消费两个方法
      2. ViewGroup:拥有分发、拦截和消费三个方法
      3. View:拥有分发、消费两个方法

Activity对点击事件的分发过程

我们对触摸屏进行操作时,Linux就会收到相应的硬件中断,然后将中断加工成原始的输入事件并写入相应的设备节点中。而我们的Android 输入系统所做的事情概括起来说就是监控这些设备节点,当某个设备节点有数据可读时,将数据读出并进行一系列的翻译加工,然后在所有的窗口中找到合适的事件接收者,并派发给它。

当点击事件产生后,事件会传递给当前的Activity,由Activity中的PhoneWindow完成,PhoneWindow再把事件处理工作交给DecorView,之后再有DecorView将事件处理工作交给ViewGroup

五、View的事件分发机制

事件分发到ViewGroupdispatchTouchEvent方法,如果它的onInterceptTouchEvent返回true,则由自己处理,这时如果它的mOnTouchListener被设置,则onTouch会被调用,否则onTouchEvent会被调用。在onTouchEvent中,如果设置了mOnCLickListener,则onClick会被调用。如果它的onInterceptTouchEvent返回false,则交给点击事件链上的子View处理,如此循环,完成分发。






如下是View完整的点击事件传递流程:

六、点击事件分发的传递规则

点击事件分发的3个重要方法的关系,伪代码表示:

【一些重要结论】

  1. 事件传递的优先级:onTouchListener.onTouch > onTouchEvent > onLongClickListener.onLongClick > onClickListener.onClick
  2. 正常情况下,一个时间序列只能被一个View拦截且消耗。因为一旦一个元素拦截了此事件,那么同一个事件序列内的所有事件都会直接交给它处理(即不会再调用这个View的拦截方法去询问它是否要拦截了,而是把剩余的ACTION_MOVE、ACTION_DOWN等事件直接交给它来处理)。特例:通过将重写View的onTouchEvent返回false可强行将事件转交给其他View处理。
  3. 如果View不消耗除ACTION_DOWN以外的其他事件,那么这个点击事件会消失,此时父元素的onTouchEvent并不会被调用,并且当前View可以持续收到后续的事件,最终这些消失的点击事件会传递给Activity处理。
  4. ViewGroup默认不拦截任何事件(返回false)。
  5. View的onTouchEvent默认都会消耗事件(返回true),除非它是不可点击的(clickable和longClickable同时为false)。View的longClickable属性默认都为false,clickable属性要分情况,比如Button的clickable属性默认为true,而TextView的clickable默认为false。
  6. 通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发过程,但是ACTION_DOWN事件除外。

Android面试必问之触摸事件传递机制相关推荐

  1. Android面试必问框架原理

    Android面试必问框架原理 volatile的实现原理 synchronized的实现原理 join方法实现原理 CAS无锁编程的原理 ReentrantLock的实现原理 AQS的大致实现思路 ...

  2. Android之Android触摸事件传递机制

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53431274 本文出自:[顾林海的博客] ##前言 关于Android ...

  3. android方向触摸事件,Android触摸事件传递机制,这一篇就够了

    整个触摸事件牵涉到的是,Activity,View,ViewGroup三者的传递机制. 这个触摸事件就是从外层往内层一层层的传递. 整个传递机制,分为3个步骤:分发,拦截,和消费. 1. 触摸事件的类 ...

  4. 划重点!百度、阿里、腾讯大厂Android面试必问知识点系统梳理,啃一半公司随便挑

    前言 大厂面试一直是我们程序员小伙伴茶余饭后所津津乐道的话题.能进一线互联网大厂工作,也是每个程序员生涯的梦想,为的不仅仅是大厂的种种福利.工作环境和高薪,更为的是大厂的工作氛围,能加入到大牛的圈子, ...

  5. 阿里、腾讯大厂Android面试必问知识点系统梳理,满满干货指导

    前言 金三银四,又是一年校招季. 经历过,才深知不易.最近,和作为校招面试官的同事聊了聊,问他们是如何去考察一个学生的,我简单归为以下几点: 聪明.反应快,这点自不必说,聪明意味着学习能力.适应力强, ...

  6. 今年Android面试必问的这些技术面,面试心得体会

    前言 不清楚你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的可怜,甚至只有1-3个人,连一个项目小组都算不上,而这样的团队却要承担一个软件公司所有的软件开发任务,在软件上线和开 ...

  7. Android 触摸事件传递机制

    android系统中的每个View的子类都具有下面三个和TouchEvent处理密切相关的方法: 1)public boolean dispatchTouchEvent(MotionEvent ev) ...

  8. Android面试必问的Activity,初阶,中高阶问法,你都掌握了吗?(要求熟读并背诵全文)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cXs1wGDx-1605843173409)(https://upload-images.jianshu.io/uplo ...

  9. 想学IT的必看!今年Android面试必问的这些技术面,架构师必备技能

    第一次观看我文章的朋友,可以关注.点赞.转发一下,每天分享各种干货技术和程序猿趣事 前言 职场的金三银四跳槽季又来了,不同的是今年比往年「冷」一些,形式更加严峻一些,大家多多少少可能都听到或看到一些信 ...

最新文章

  1. 【Netty】Netty组件介绍
  2. Java Servlet关键点详解
  3. 设备自动获取ip DHCP模型 IP为169.254.4.193
  4. 【C语言】动态分配二维字符串数组
  5. Qt for Android调用android原生Toast控件
  6. Leetcode 1559二维网格图中探测环 技巧DFS|剪枝
  7. sqlserver mysql时间格式化_SqlServer时间格式化
  8. 小程序开发之基础知识(0)
  9. zzulioj 1065:统计数字字符个数
  10. kettle 调用存储过程_Mysql存储过程
  11. 60-124-340-源码-运行模式-Yarn-通过 YARN 的资源本地化技术减少 Flink 在 YARN 上的部署时间
  12. python数组中一列拆分,根据Python中的数组值拆分数组
  13. 2021.9.11周六PAT甲级考试复盘与总结
  14. AI魔法手!用算法修复老照片
  15. java串口rxtx_Java串口操作RXTX
  16. uiautomatorviewer详解
  17. 基于用户体验的设计思想和用户体验概述
  18. 4种最适合零基础入门的编程语言排行榜
  19. UIDatePicker得到的时间中怎么去掉时分秒(字符串操作知识拓展)--iOS开发
  20. 对不起我爱你在线观看(完整版)

热门文章

  1. 跳台阶基础版、改进版(不能连续跳2阶)
  2. jango使用xlwt时单元格控制
  3. PDD 7.28秋招笔试题
  4. python怎么读取特定路径文件夹下的图片
  5. 计算机及外设维修工初级题库,维修电工技师题库(5)
  6. VS创建和使用C++静态链接库教程
  7. linux学成之路(基础篇)(九)linux网络管理
  8. 第一台通用计算机的名称,世界上第一台计算机的名称是什么
  9. Python爬虫之数据解析/提取(二)
  10. 4.用程序实现支付链接转为二维码