Android面试必问之触摸事件传递机制
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的事件分发机制
事件分发到
ViewGroup
的dispatchTouchEvent
方法,如果它的onInterceptTouchEvent
返回true
,则由自己处理
,这时如果它的mOnTouchListener
被设置,则onTouch
会被调用,否则onTouchEvent会被调用
。在onTouchEvent
中,如果设置了mOnCLickListener
,则onClick会被调用
。如果它的onInterceptTouchEvent
返回false
,则交给点击事件链上的子View处理
,如此循环,完成分发。
如下是View完整的点击事件传递流程:
六、点击事件分发的传递规则
点击事件分发的3个重要方法的关系,伪代码表示:
【一些重要结论】
- 事件传递的优先级:
onTouchListener.onTouch
>onTouchEvent
>onLongClickListener.onLongClick
>onClickListener.onClick
正常情况下,一个时间序列只能被一个View拦截且消耗
。因为一旦一个元素拦截了此事件,那么同一个事件序列内的所有事件都会直接交给它处理(即不会再调用这个View的拦截方法去询问它是否要拦截了,而是把剩余的ACTION_MOVE、ACTION_DOWN等事件直接交给它来处理)。特例:通过将重写View的onTouchEvent返回false可强行将事件转交给其他View处理。
- 如果View不消耗除ACTION_DOWN以外的其他事件,那么这个点击事件会消失,此时父元素的onTouchEvent并不会被调用,并且当前View可以持续收到后续的事件,最终这些消失的点击事件会传递给Activity处理。
ViewGroup默认不拦截任何事件
(返回false)。View的onTouchEvent默认都会消耗事件
(返回true),除非它是不可点击的(clickable和longClickable同时为false)。View的longClickable属性默认都为false,clickable属性要分情况,比如Button的clickable属性默认为true,而TextView的clickable默认为false。- 通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发过程,但是ACTION_DOWN事件除外。
Android面试必问之触摸事件传递机制相关推荐
- Android面试必问框架原理
Android面试必问框架原理 volatile的实现原理 synchronized的实现原理 join方法实现原理 CAS无锁编程的原理 ReentrantLock的实现原理 AQS的大致实现思路 ...
- Android之Android触摸事件传递机制
转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53431274 本文出自:[顾林海的博客] ##前言 关于Android ...
- android方向触摸事件,Android触摸事件传递机制,这一篇就够了
整个触摸事件牵涉到的是,Activity,View,ViewGroup三者的传递机制. 这个触摸事件就是从外层往内层一层层的传递. 整个传递机制,分为3个步骤:分发,拦截,和消费. 1. 触摸事件的类 ...
- 划重点!百度、阿里、腾讯大厂Android面试必问知识点系统梳理,啃一半公司随便挑
前言 大厂面试一直是我们程序员小伙伴茶余饭后所津津乐道的话题.能进一线互联网大厂工作,也是每个程序员生涯的梦想,为的不仅仅是大厂的种种福利.工作环境和高薪,更为的是大厂的工作氛围,能加入到大牛的圈子, ...
- 阿里、腾讯大厂Android面试必问知识点系统梳理,满满干货指导
前言 金三银四,又是一年校招季. 经历过,才深知不易.最近,和作为校招面试官的同事聊了聊,问他们是如何去考察一个学生的,我简单归为以下几点: 聪明.反应快,这点自不必说,聪明意味着学习能力.适应力强, ...
- 今年Android面试必问的这些技术面,面试心得体会
前言 不清楚你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的可怜,甚至只有1-3个人,连一个项目小组都算不上,而这样的团队却要承担一个软件公司所有的软件开发任务,在软件上线和开 ...
- Android 触摸事件传递机制
android系统中的每个View的子类都具有下面三个和TouchEvent处理密切相关的方法: 1)public boolean dispatchTouchEvent(MotionEvent ev) ...
- Android面试必问的Activity,初阶,中高阶问法,你都掌握了吗?(要求熟读并背诵全文)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cXs1wGDx-1605843173409)(https://upload-images.jianshu.io/uplo ...
- 想学IT的必看!今年Android面试必问的这些技术面,架构师必备技能
第一次观看我文章的朋友,可以关注.点赞.转发一下,每天分享各种干货技术和程序猿趣事 前言 职场的金三银四跳槽季又来了,不同的是今年比往年「冷」一些,形式更加严峻一些,大家多多少少可能都听到或看到一些信 ...
最新文章
- 【Netty】Netty组件介绍
- Java Servlet关键点详解
- 设备自动获取ip DHCP模型 IP为169.254.4.193
- 【C语言】动态分配二维字符串数组
- Qt for Android调用android原生Toast控件
- Leetcode 1559二维网格图中探测环 技巧DFS|剪枝
- sqlserver mysql时间格式化_SqlServer时间格式化
- 小程序开发之基础知识(0)
- zzulioj 1065:统计数字字符个数
- kettle 调用存储过程_Mysql存储过程
- 60-124-340-源码-运行模式-Yarn-通过 YARN 的资源本地化技术减少 Flink 在 YARN 上的部署时间
- python数组中一列拆分,根据Python中的数组值拆分数组
- 2021.9.11周六PAT甲级考试复盘与总结
- AI魔法手!用算法修复老照片
- java串口rxtx_Java串口操作RXTX
- uiautomatorviewer详解
- 基于用户体验的设计思想和用户体验概述
- 4种最适合零基础入门的编程语言排行榜
- UIDatePicker得到的时间中怎么去掉时分秒(字符串操作知识拓展)--iOS开发
- 对不起我爱你在线观看(完整版)