🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
***** **事件分发概述** [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滑动冲突解决方案