事件分发的对象是:事件
当用户触摸屏幕时(View或ViewGroup派生的控件),将产生点击事件(Touch事件)。
主要发生的Touch事件有如下四种:
MotionEvent.ACTION_DOWN:按下View(所有事件的开始)
MotionEvent.ACTION_MOVE:滑动View
MotionEvent.ACTION_CANCEL:非人为原因结束本次事件
MotionEvent.ACTION_UP:抬起View(与DOWN对应)
事件分发的本质
将点击事件(MotionEvent)向某个View进行传递并最终得到处理
即当一个点击事件发生后,系统需要将这个事件传递给一个具体的View去处理。这个事件传递的过程就是分发过程。
事件在Activity、ViewGroup、View之间进行传递
一个点击事件产生后,传递顺序是:Activity(Window) -> ViewGroup -> View
Android的UI界面是由Activity、ViewGroup、View及其派生类组合而成的
View是所有UI组件的基类
一般Button、ImageView、TextView等控件都是继承父类View
ViewGroup是容纳UI组件的容器,即一组View的集合(包含很多子View和子VewGroup)
VewGroup也是View的子类
是Android所有布局的父类或间接父类:项目用到的布局(LinearLayout、RelativeLayout等),都继承自ViewGroup,即属于ViewGroup子类
与普通View的区别:ViewGroup实际上也是一个View,只不过它多了可以包含子View和定义布局参数的功能。
事件分发过程由dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()方法协作完成的
方法详细介绍
super:调用父类方法
true:消费事件,即事件不继续往下传递
false:不消费事件,事件也不继续往下传递 / 交由给父控件onTouchEvent()处理
dispatchTouchEvent()
使用对象:Activity、ViewGroup、View
作用:分发点击事件
调用时刻:当点击事件能够传递给当前View时,该方法就会被调用
返回结果:是否消费当前事件,详细情况如下:
默认情况:根据当前对象的不同而返回方法不同
①Activity super.dispatchTouchEvent() 即调用父类ViewGroup的dispatchTouchEvent()
②ViewGroup onIntercepTouchEvent() 即调用自身的onIntercepTouchEvent()
③View onTouchEvent() 即调用自身的onTouchEvent()
onTouchEvent()
使用对象:Activity、ViewGroup、View
作用:处理点击事件
调用时刻:在dispatchTouchEvent()内部调用
返回结果:是否消费(处理)当前事件(与dispatchTouchEvent()类似)
onInterceptTouchEvent()
使用对象:ViewGroup(注:Activity、View都没该方法)
作用:拦截事件,即自己处理该事件
调用时刻:在ViewGroup的dispatchTouchEvent()内部调用
返回结果:是否拦截当前事件,详细情况如下: