*****
**事件分发概述**
[TOC=6]
# 1. 什么是事件分发(事件分发的本质)
## 1.1 事件分发的对象是谁?
**答:事件**
* 当用户触摸屏幕时(View或ViewGroup派生的控件),将产生点击事件(Touch事件)。
> Touch事件相关细节(发生触摸的位置、时间、历史记录、手势动作等)被封装成MotionEvent对象
* 主要发生的Touch事件有如下四种:
* MotionEvent.ACTION\_DOWN:按下View(所有事件的开始)
* MotionEvent.ACTION\_MOVE:滑动View
* MotionEvent.ACTION\_CANCEL:非人为原因结束本次事件
* MotionEvent.ACTION\_UP:抬起View(与DOWN对应)
* 事件列:从手指接触屏幕至手指离开屏幕,这个过程产生的一系列事件 任何事件列都是以DOWN事件开始,UP事件结束,中间有无数的MOVE事件,如下图:
![](https://box.kancloud.cn/c9151879d38153bc06a57e86275c70e0_990x180.png)
即当一个MotionEvent 产生后,系统需要把这个事件传递给一个具体的 View 去处理。
## 1.2 事件分发的本质
**答:将点击事件(MotionEvent)向某个View进行传递并最终得到处理**
> 即当一个点击事件发生后,系统需要将这个事件传递给一个具体的View去处理。**这个事件传递的过程就是分发过程。**
## 1.3 事件在哪些对象之间进行传递?
**答:Activity、ViewGroup、View**
> 一个点击事件产生后,传递顺序是:Activity(Window) -> ViewGroup -> View
* Android的UI界面是由Activity、ViewGroup、View及其派生类组合而成的
![](https://box.kancloud.cn/a70803c24a100f1551856570aa4e672f_256x409.png)
* UI界面
* View是所有UI组件的基类
> 一般Button、ImageView、TextView等控件都是继承父类View
* ViewGroup是容纳UI组件的容器,即一组View的集合(包含很多子View和子VewGroup),
> 1. 其本身也是从View派生的,即ViewGroup是View的子类
> 2. 是Android所有布局的父类或间接父类:项目用到的布局(LinearLayout、RelativeLayout等),都继承自ViewGroup,即属于ViewGroup子类。
> 3. 与普通View的区别:ViewGroup实际上也是一个View,只不过比起View,它多了可以包含子View和定义布局参数的功能。
## 1.4 事件分发过程由哪些方法协作完成?
**答:dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()**
![](https://box.kancloud.cn/871dbc64f428b71bac838c4094a9f6bf_653x319.png)
## 1.5 总结
* Android事件分发机制的本质是要解决:**点击事件由哪个对象发出,经过哪些对象,最终达到哪个对象并最终得到处理。**
> 这里的对象是指Activity、ViewGroup、View
* Android中事件分发顺序:**Activity(Window) -> ViewGroup -> View**
* 事件分发过程由dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()三个方法协助完成
# 2. 为什么要有事件分发
解决一些冲突 如:
1. ScrollView签到ListView或GridView滑动冲突解决方案
2. ViewPager嵌套ViewPager滑动冲突解决方案
- 咨询项目实战
- 第一单元 HTTP协议
- 1.1 OSI七层模型
- 1.2 HTTP协议(重点)
- 1.3 HTTPS协议(了解)
- 1.4 TCP/IP协议扩展
- 1.5 WebService简介及实战(无接口)
- 1.6 课后练习
- 第二单元 HTTPURLConnection
- 2.1 ANR
- 2.2 网络判断
- 2.3 HTTPURLConnection
- 2.4 课后练习
- 第三单元 AsyncTask
- 3.1 AsyncTask概述
- 3.2 AsyncTask基本使用
- 3.3 课后练习
- 第四单元 图片异步加载
- 4.1 图片异步加载概述
- 4.2 LruCache
- 4.3 DiskLRUCache
- 4.4 图片三级缓存概述
- 4.5 封装图片加载缓存框架
- 第五单元 ListView多条目
- 5.1 ListView多条目概述
- 5.2 ListView多条目的使用
- 第六单元 ListView实现下拉刷新上拉加载
- 6.1 下拉刷新和上拉加载更多
- 6.2 XListView概述
- 6.3 XListView的使用
- 第七单元 封装网络框
- 7.1 封装网络框架概述
- 7.2 网络框架的封装
- 第八单元 项目介绍
- 8.1 公司项目团队架构简介
- 8.2 项目文档及项目流程介绍
- 8.3 项目管理
- 8.4 项目开发
- 第九单元 项目框架搭建
- 9.1 基类封装概述
- 9.2 Application中初始化配置
- 9.3 项目中的工具类
- 9.4 封装网络请求框架
- 9.5 封装图片异步缓存框架
- 第十单元 搭建UI框架1
- 10.1 侧滑菜单概述
- 10.2 主界面框架搭建
- 第十一单元 搭建UI框架2
- 11.1 TabLayout的概述
- 11.2 TabLayout的使用
- 第十二单元 图片上传
- 12.1 图片上传概述
- 12.2 图片上传的实现
- 第十三单元 PullToRefresh
- 13.1 PullToRefresh概述
- 13.2 PullToRefresh的使用
- 13.3 缓存业务实现思路
- 第十四单元 事件分发及滑动冲突
- 14.1 事件分发概述
- 14.2 事件分发流程
- 14.3 事件分发的使用
- 第十五单元 传感器的基本使用
- 15.1 传感器概述
- 15.2 传感器的使用
- 第十六单元 HTML与CSS复习
- 16.1 HTML
- 16.2 CSS
- 第十七单元 js复习
- 17.1 js基础语法
- 17.2 js数组和内置对象
- 17.3 js常用事件
- 17.4 js对象模型
- 17.5 js 正则表达式
- 第十八单元 WebView
- 18.1 WebView 概述
- 18.2 WebView的使用
- 18.3 WebView与js交互
- 第十九单元 项目案例
- 项目概述
- 第二十单元 项目答辩
- 周考
- 第一周周考
- 第二周周考
- 第三种周考
- 月考
- 接口文档