一.事件分发的基础概念:

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的事件分发机制相关推荐

  1. Android View的事件分发机制解析

    作者:网易·周龙 最近刚看完android-Ultra-Pull-To-Refresh下拉刷新的源码,发现在写自定义控件时,对于View的事件的传递总是搞不太清楚,而View事件的分发机制,又是解决可 ...

  2. Android View的事件分发机制和滑动冲突解决方案

    这篇文章会先讲Android中View的事件分发机制,然后再介绍Android滑动冲突的形成原因并给出解决方案.因水平有限,讲的不会太过深入,只希望各位看了之后对事件分发机制的流程有个大概的概念,并且 ...

  3. 安卓自定义View进阶-事件分发机制原理【转自 app架构师 微信公众号】

    注意:本文中所有源码分析部分均基于 API23(Android 6.0) 版本,由于安卓系统源码改变很多,可能与之前版本有所不同,但基本流程都是一致的. 为什么要有事件分发机制? 安卓上面的View是 ...

  4. View体系与自定义View(三)—— View的事件分发机制

    1. 分析Activity的构成 一个Activity包含一个Window对象,这个对象是由PhoneWindow来实现的.PhoneWindow将DecorView作为整个应用窗口的根View. 而 ...

  5. 自定义View(二)--表层浅析View的事件分发机制和滑动冲突

    转载请注明出处:From李诗雨:http://blog.csdn.net/cjm2484836553/article/details/54387722 不诗意的女程序猿不是好厨师~ 这篇文章来得有些曲 ...

  6. 安卓自定义View进阶-事件分发机制原理

    之前讲解了很多与View绘图相关的知识,你可以在 安卓自定义View教程目录 中查看到这些文章,如果你理解了这些文章,那么至少2D绘图部分不是难题了,大部分的需求都能满足,但是关于View还有很多知识 ...

  7. Android View体系(五)从源码解析View的事件分发机制

    Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Sc ...

  8. 安卓自定义View进阶-事件分发机制详解

    原文地址:http://www.gcssloop.com/customview/dispatch-touchevent-source Android 事件分发机制详解,在上一篇文章 事件分发机制原理  ...

  9. View的事件分发机制简述

    要分析的对象就是MotionEvent,点击事件的事件分发其实就是对MotionEvent事件的分发过程,当MotionEvent产生后,系统需要把这个事件传递给一个具体的View,这个传递过程就是分 ...

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

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

最新文章

  1. JS重复引用也会导致错误
  2. vs内存泄露检测方法
  3. golang mysql商业用例_完美起航-golang操作mysql用例
  4. NET问答: 如何从 event 中移除所有的 handler ?
  5. c语言 如何连接两个程序,C语言连接两个链表程序
  6. synchronized 加锁 this 和 class 的区别!
  7. 对比学习:充分利用有限的医学标注数据 |NeurIPS 2020
  8. mysql 随机函数 效率_MySQL 随机函数获取数据速度和效率分析
  9. 设计模式之GOF23代理模式02
  10. Atitit Atitit.软件兼容性原理----------API兼容 Qa7
  11. uniapp区分不同平台
  12. ActiveMQ 下载历史版本
  13. 通过BIOS设置启用CPU虚拟化解决VMware虚拟机不支持X86_64位linux操作系统安装问题
  14. 数据分析|WordCloud PCA K-means - 「某电商平台」电脑评论分析
  15. qpython 3h下载_【分享】QPython 3H3.0.0 一个伟大的脚本编辑器!
  16. 阿里巴巴达摩院发布2019十大科技趋势:数字身份将成为第二张身份证
  17. C#习题——三角形或者长方形的边长,计算其周长和面积
  18. 《计算机网络—自顶向下方法》 第四章Wireshark实验:IP
  19. web开发要学习什么技术,HTML实体字符列表
  20. 华为推出智能眼镜;苹果首次在俄罗斯被起诉

热门文章

  1. c语言this什么意思,JavaScript 中的this是什么?它到底做了什么?
  2. 基于python的异方差检验_异方差检验及解决方法
  3. Ubuntu下LimeSDR-USB或LimeSDR Mini使用说明
  4. PaddleNLP登顶FewCLUE小样本学习榜单;AutoPrompt自动化提示功能直接带你原地起飞
  5. 虚幻4蓝图各颜色代表的含义
  6. Linux 音频系统简析
  7. postgresql如何优雅地清理磁盘空间碎片VACUUM
  8. PPT插入文本框的方法技巧
  9. 五险一金,这篇就够了
  10. koa 设置cache_nodejs cache 缓存机制的简单实现