安卓事件分发机制
一、事件是什么
事件是指用户与应用程序交互时产生的动作或操作,如触摸事件、手势事件、按键事件。
二、事件分发机制是什么
安卓事件分发机制是指在安卓系统中,如何处理和传递用户交互事件的一套机制。
本质:当触发一个点击事件时,系统将这个事件传递给一个具体的View去处理,这个事件传递的过程就是分发过程。
三、事件分发机制存在的意义
为确保用户在应用程序届满上的交互能够正确捕获、传递和处理,从而实现用户与应用程序的有效交互。(简单说就是点击事件存在冲突,用事件分发机制解决)
四、事件在哪些对象中传递?传递顺序是什么?
在Activity、ViewGroup、View中传递。
事件传递的顺序:Activity->ViewGroup->View;即触发一个点击事件时,事件先传递至Activity、在传递到ViewGroup、最终到View中。
1.Activity的事件分发机制
三者介绍:
Activity:每个Activity都会包含一个或者多个Window,并通过Window管理其显示内容。
Window:是抽象类,用于表示一个界面窗口,唯一实现是PhoneWindow。
DecorView:是Activity的最顶层View,继承自FrameLayout,包含了整个界面的布局。
2.ViewGroup的事件分发机制
3.View的事件分发机制
五、事件分发的三个主要方法
1.分发:dispatchTouchEvent
此方法用来处理事件的分发,当事件传递给当前View时,首先就是通过调用此方法进行传递的,如果当前View所包含的子View的dispatchTouchEvent方法或者当前View的onTouchEvent方法处理了事件,通常返回true,表示事件已消费,如果没有处理则返回false。
2.拦截:onInterceptTouchEvent(只有在ViewGroup中有)
此方法用来判断某个事件是否需要被拦截,如果某个View拦截了此事件,那么整个事件序列中,此方法不会再被调用,因为会把当前View赋值给mFirstTouchTarget(原本为null),后续传递判断mFirstTouchTarget!=null时,就会调用它的onTouchEvent方法,交给mFirstTouchTarget处理事件。
3.处理:onTouchEvent
用来处理事件,如果事件被消费了,通常返回true,否则返回false,并再同一个事件序列中,当前View不会再接受到事件。
我们梳理一下从根ViewGroup(也就是DecorView)往下传递事件的过程:首先,事件产生后,通过调用根ViewGroup的dispatchTouchEvent方法,然后,如果这个ViewGroup要拦截事件, 则它的onInterceptTouchEvent返回true,然后事件交给它的onTouchEvent处理,不再进行传递。如果不拦截,则继续调用子view的dispatchTouchEvent方法,继续往下传递,往下递归,直到最终被处理。如果没有任何一个view处理事件, 则最终又会回调给Activity的onTouchEvent方法,如果Activity也不处理,则此事件结束,且没做任何处理。