Android View框架总结(七)View事件分发机制
请尊重分享成果,转载请注明出处:
http://blog.csdn.net/hejjunlin/article/details/52282833
View布局告一段落,从本篇开始View事件相关分析,今天分析的是View的事件分发机制(PS:本篇文章中源码均是android 6.0,请知晓)
- View 事件的分发机制
- dispatchTouchEvent
- onTouchEvent
- 案例
事件通常重要的有如下三种:
MotionEvent.ACTION_DOWN 按下View,是所有事件的开始
MotionEvent.ACTION_MOVE 滑动事件
MotionEvent.ACTION_UP 与down对应,表示抬起
事件的响应原理:
在android系统中,最广泛应用的就是监听、回调,进而形成了事件响应的过程。通俗就是说,你出去度假,提前预定过某酒店并注册,你在去那儿时,就能办入往手续,不用重新注册。立刻享用你的房间就行。
首先,我们要熟悉dispatchTouchEvent和onTouchEvent两个方法,话不多说,read the fucking source
View.java -> dispatchTouchEvent()
View.java -> onTouchEvent()
以上代码补充点:一个clickable或者longclickable的View是一直要消费Touch事件的,而一般的View既不是clickable也不是longclickable的(即不会消费Touch事件,只会执行ACTION_DOWN而不会执行ACTION_MOVE和ACTION_UP) Button是clickable的,可以消费Touch事件,但是我们可以通过setClickable()和setLongClickable()来设置View是否为clickable和longClickable。当然还可以通过重写View的onTouchEvent()方法来控制Touch事件的消费与否
View.java -> CheckForTap()
View.java -> checkForLongClick()
View.java.$CheckForLongPress -> run()
View.java.$CheckForLongPress -> performClick()
看个小例子,我们知道通常来说,Button、ImageView、TextView等控件都是继承父类View来实现的。RelativeLayout、LinearLayout、FrameLayout等布局都是继承父类ViewGroup来实现的,下面选 Button来演示View事件分发,当然我也会切换TextView,来看看它们是否有不同之处:
MainActivity,给EventButton设置了OnTouchListener监听,同时它本身有onTouchEvent,及onDispatchTouchEvent
这是一个自定义的button
布局文件
运行在studio,在手机上如图:
点击按钮,看日志输出:
可以看到,执行过程为
dispatchTouchEvent() -> setOnTouchListener() -> onTouchEvent()
如果手指一直长按,超过系统认为的时间,那么就认为是一次长按键,可以发现是在down时触发的,这和我们分析源代码时,是对应起来的,当UP时,触发onClick
在这说下,如果上面的EventButton继承TextView的话,按下抬起,会有一个特别现象,我可以告诉大家现象:就是只有dispatchTouchEvent ACTION_DOWN,onTouch ACTION_DOWN,onTouchEvent ACTION_DOWN这三个,你移动,或者抬起,是没有MOVE,或者UP的,这个答案,我下篇开头告诉大家(细心同学在本篇中也可找到答案,嘿嘿)。
从以上log可看出,设置了onLongClickListener是先执行的,那么要想执行点击事件,这个View就必须要消费ACTION_DOWN和ACTION_MOVE事件,并且没有设置OnLongClickListener的情况下,如果设置了OnLongClickListener的情况下,需要onLongClick()返回false才能执行到onClick()方法,也许你又会纳闷,一般的View默认是不消费touch事件的,这不是和你上面说的相违背嘛,我们要向执行click事件必须要调用setOnClickListener()来设置OnClickListener接口,看下这个callback:
也就是说,这个view如果不是/clickable的,在设转置setOnClickListener时,会设置一个clickable为true.
以下过程来用一张图来结尾:
至此,先分析到这里,确实有点晚了。~@~
第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注。
如果你觉得好,随手点赞,也是对笔者的肯定,也可以分享此公众号给你更多的人,原创不易
Android View框架总结(七)View事件分发机制相关推荐
- Android:30分钟弄明白Touch事件分发机制
Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...
- Android事件分发机制浅析
文章目录 前言 一.MotionEvent 二.事件分发 1.代码模型 2.代码分析 0x00.Activity 0x01.ViewGroup 1.是否分发事件 2.事件分发前清除标记 关于Touch ...
- Android系统分析之带着问题看事件分发机制
Android 触摸事件分发机制? Android系统分析之带着问题看事件分发机制 一 事件分发机制 1 什么是事件分发机制? 1.1 什么是事件? 答:当用户触摸屏幕时,每一次的点击,按下,移动,抬 ...
- 完全理解Android TouchEvent事件分发机制(一)
本文能给你带来和解决一些你模糊的Touch事件概念及用法 1.掌握View及ViewGroup的TouchEvent事件分发机制 2.为解决View滑动冲突及点击事件消费提供支持 3.为你解决面试中的 ...
- Android View 事件分发机制详解
想必很多android开发者都遇到过手势冲突的情况,我们一般都是通过内部拦截和外部拦截法解决此类问题.要想搞明白原理就必须了解View的分发机制.在此之前我们先来了解一下以下三个非常重要的方法: di ...
- Android View系列(二):事件分发机制源码解析
概述 在介绍点击事件规则之前,我们需要知道我们分析的是MotionEvent,即点击事件,所谓的事件分发就是对MotionEvent事件的分发过程,即当一个MotionEvent生成以后,系统需要把这 ...
- Android View体系(五)从源码解析View的事件分发机制
Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Sc ...
- Android View的事件分发机制和滑动冲突解决方案
这篇文章会先讲Android中View的事件分发机制,然后再介绍Android滑动冲突的形成原因并给出解决方案.因水平有限,讲的不会太过深入,只希望各位看了之后对事件分发机制的流程有个大概的概念,并且 ...
- 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发机制...
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...
- 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...
最新文章
- (附视频) | AI奠基人、美国AI科学家特伦斯谈深度学习​
- ie6 ie7 绝对定位 相对定位 层被遮住
- python文件不存在时创建文件_python-创建一个文件(如果不存在)
- 福布斯中国2018年30位30岁以下精英榜单发布,为什么是他们?
- Spring:自动装配模式
- Lock锁的简单使用
- 数据库的跨平台设计(转)
- linux安装vmware没有网络,关于无桌面的linux安装VMWare Tools配置的教程
- 2021年双非院校保研浙江大学软件学院末位上车经验记录
- 独立站运营必知:关于聊天机器人的十大好处
- 在校招中,应届生们如何写出简洁的 Android 开发简历,减少被刷的机率
- 阿里云服务器能怎么玩呢?
- CGAL::2D Arrangements
- CVPR 2022|解耦知识蒸馏!旷视提出DKD:让Hinton在7年前提出的方法重回SOTA行列!...
- W-2 Grub4dos硬盘安装BackTrack
- Microsoft (Office) 365本地无法激活解决方案
- 对接顺丰(丰桥)查询物流信息
- Open3D 渐进式形态学滤波
- 【uni-app学习】uni-app低功耗蓝牙采坑记录
- 超全MyBatis动态代理详解!(绝对干货)
热门文章
- 编译php的问题,php编译常见错误
- Mybatis批量insert报错的解决办法【the right syntax to use near '' at line...】
- python判断文件或文件夹是否存在
- 开源真实场景图像检测数据集汇总
- ​知者见于未萌:百度CTO王海峰与中国 AI 三十年
- 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
- 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了
- Django组件 中间件
- 7_22 day25 8min super调用父类方法
- 3.openldap生成LDAP用户