View的事件分发机制
一.事件分发的基础概念:
1.事件分发的本质:
将点击事件(MotionEvent)传递到某个具体的View或者ViewGroup处理的过程。
2.事件的类型:
这里的事件指的就是点击事件(MotionEvent),主要分为以下几个类型:
(1)ACTION_DOWN:手指刚碰到屏幕的时候;
(2)ACTION_UP:手指离开屏幕的时候;
(3)ACTION_CANCEL:结束事件的时候(子View处理事件的过程中,父View拦截事件,收回处理权,此时的子View会收到这个事件);
(4)ACTION_MOVE:手指在屏幕上进行滑动的时候;
3.事件分发的方法:
(1)dispatchTouchEvent():分发点击事件;
(2)onTouchEvent():处理点击事件;
(3)onInterceptTouchEvent():拦截某个事件;
4.事件分发方法的调用:
(1)dispatchTouchEvent():当点击事件能够传递给当前的View的时候调用;
(2)onTouchEvent():在dispatchTouchEvent()方法的内部调用;
(3)onInterceptTouchEvent():在ViewGroup的diapatchTouchEvent()方法的内部调用;
5.事件分发方法的图解:
6.事件分发的流程:
Activity->ViewGroup->View
二.事件分发的具体分析:
1.Activity的事件分发机制:
2.ViewGroup的事件分发机制:
3.View的事件分发机制
注意:部分图片来源自博客:https://www.jianshu.com/p/38015afcdb58
三.滑动冲突的相关知识:
1.常见的滑动冲突场景:
(1)场景一:外部滑动方向和内部滑动方向不一致;
(2)场景二:外部滑动方向和内部滑动方向一致;
(3)场景三:以上两种场景的嵌套;
2.滑动冲突的解决方式:
(1)外部拦截法:所谓的外部拦截法是指点击事件都先经过父容器的拦截处理,如果父容器需要此事件就拦截,如果不需要此事件就不拦截,这样就可以解决滑动冲突的问题,这种比较符合点击事件的分发机制。
说明:
[1] 外部拦截法需要重写父容器的onInterceptTouchEvent()方法,在内部做相应的拦截即可。
[2] 在onInterceptTouchEvent()方法中,对于ACTION_DOWN这个事件,父容器必须返回false,即不拦截ACTION_DOWN事件,这是由于如果父容器拦截了这个事件,后续的ACTION_MOVE和ACTION_UP事件都会由父容器进行处理,就没法传递给子元素了。
[3] 在onInterceptTouchEvent()方法中,对于ACTION_MOVE这个事件,这个根据具体的需求来决定要不要拦截,如果父容器需要拦截就返回true,不需要拦截就返回false。
[4] 在onInterceptTouchEvent()方法中,对于ACTION_UP这个事件,必须要返回false,因为这个事件本身没有太大的意义。
(2)内部拦截法:内部拦截法是指父容器不拦截任何事件,所有的事件都传递给子元素,如果子元素需要此事件就直接消耗掉,如果子元素不需要此事件就交由父容器进行处理,这种方法和点击事件的分发机制不一致,需要配合requestDisallowInterceptTourchEvent方法才能正常工作。
View的事件分发机制相关推荐
- Android View的事件分发机制解析
作者:网易·周龙 最近刚看完android-Ultra-Pull-To-Refresh下拉刷新的源码,发现在写自定义控件时,对于View的事件的传递总是搞不太清楚,而View事件的分发机制,又是解决可 ...
- Android View的事件分发机制和滑动冲突解决方案
这篇文章会先讲Android中View的事件分发机制,然后再介绍Android滑动冲突的形成原因并给出解决方案.因水平有限,讲的不会太过深入,只希望各位看了之后对事件分发机制的流程有个大概的概念,并且 ...
- 安卓自定义View进阶-事件分发机制原理【转自 app架构师 微信公众号】
注意:本文中所有源码分析部分均基于 API23(Android 6.0) 版本,由于安卓系统源码改变很多,可能与之前版本有所不同,但基本流程都是一致的. 为什么要有事件分发机制? 安卓上面的View是 ...
- View体系与自定义View(三)—— View的事件分发机制
1. 分析Activity的构成 一个Activity包含一个Window对象,这个对象是由PhoneWindow来实现的.PhoneWindow将DecorView作为整个应用窗口的根View. 而 ...
- 自定义View(二)--表层浅析View的事件分发机制和滑动冲突
转载请注明出处:From李诗雨:http://blog.csdn.net/cjm2484836553/article/details/54387722 不诗意的女程序猿不是好厨师~ 这篇文章来得有些曲 ...
- 安卓自定义View进阶-事件分发机制原理
之前讲解了很多与View绘图相关的知识,你可以在 安卓自定义View教程目录 中查看到这些文章,如果你理解了这些文章,那么至少2D绘图部分不是难题了,大部分的需求都能满足,但是关于View还有很多知识 ...
- Android View体系(五)从源码解析View的事件分发机制
Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Sc ...
- 安卓自定义View进阶-事件分发机制详解
原文地址:http://www.gcssloop.com/customview/dispatch-touchevent-source Android 事件分发机制详解,在上一篇文章 事件分发机制原理 ...
- View的事件分发机制简述
要分析的对象就是MotionEvent,点击事件的事件分发其实就是对MotionEvent事件的分发过程,当MotionEvent产生后,系统需要把这个事件传递给一个具体的View,这个传递过程就是分 ...
- 一文读懂Android View事件分发机制
Android View 虽然不是四大组件,但其并不比四大组件的地位低.而View的核心知识点事件分发机制则是不少刚入门同学的拦路虎.ScrollView嵌套RecyclerView(或者ListVi ...
最新文章
- JS重复引用也会导致错误
- vs内存泄露检测方法
- golang mysql商业用例_完美起航-golang操作mysql用例
- NET问答: 如何从 event 中移除所有的 handler ?
- c语言 如何连接两个程序,C语言连接两个链表程序
- synchronized 加锁 this 和 class 的区别!
- 对比学习:充分利用有限的医学标注数据 |NeurIPS 2020
- mysql 随机函数 效率_MySQL 随机函数获取数据速度和效率分析
- 设计模式之GOF23代理模式02
- Atitit Atitit.软件兼容性原理----------API兼容 Qa7
- uniapp区分不同平台
- ActiveMQ 下载历史版本
- 通过BIOS设置启用CPU虚拟化解决VMware虚拟机不支持X86_64位linux操作系统安装问题
- 数据分析|WordCloud PCA K-means - 「某电商平台」电脑评论分析
- qpython 3h下载_【分享】QPython 3H3.0.0 一个伟大的脚本编辑器!
- 阿里巴巴达摩院发布2019十大科技趋势:数字身份将成为第二张身份证
- C#习题——三角形或者长方形的边长,计算其周长和面积
- 《计算机网络—自顶向下方法》 第四章Wireshark实验:IP
- web开发要学习什么技术,HTML实体字符列表
- 华为推出智能眼镜;苹果首次在俄罗斯被起诉