这里主要介绍Activity、View、ViewGroup三者的触摸事件传递机制,一次完整的事件传递主要包括三个阶段,分别是事件的分发、拦截和消费。触摸事件对应的是MotionEvent类,事件的类型主要有三种:ACTION_DOWN、ACTION_MOVE、ACTION_UP。
分发:事件的分发对应着dispatchTouchEvent方法,在这个方法中,根据当前视图的具体实现逻辑,来决定是直接消费这个事件还是将事件继续分发给子视图处理,方法返回值为True表示事件被当前视图消费掉,不再继续分发事件;方法返回super.dispatchTouchEvent表示继续分发该事件。
拦截:事件的拦截对应着onInterceptTouchEvent方法,该方法只在ViewGroup及其子类中才存在,在View和Activity中是不存在的。这个方法也是通过返回的布尔值来决定是否拦截对应的事件,返回true标识拦截这个事件,不继续分发给子视图,同时交由自身的onTouchEvent方法进行消费;返回false或super.onInterceptTouchEvent表示不对事件进行拦截,需要继续传递给子视图。
消费:事件的消费对应着onTouchEvent方法,该方法返回true表示当前视图可以处理对应的事件,事件将不会向上传递给父视图;返回值为false表示当前视图不能处理这个事件,事件会被传递给父视图的onTouchEvent方法进行处理。
在Android个系统中,拥有事件传递能力的类有以下三种:
--Activity:拥有dispatchTouchEvent和onTouchEvent两个方法
--ViewGroup:拥有dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三个方法
--View:拥有dispatchTouchEvent和onTouchEvent两个方法
View类的触摸事件的传递过程如下:
--触摸事件的传递流程是从dispatchTouchEvent开始的,如果不进行人为干预(也就是默认返回父类的同名函数),则事件将会依照嵌套层次从外层向内层传递,到达最内层的View时,就由它的onTouchEvent方法处理。该方法如果能够消费该事件,则返回true,如果处理不了,则返回false,这时事件会重新向外层传递,并由外层View的onTouchEvent方法进行处理,依次类推。
--如果事件在向内层传递过程中由于人为干预,事件处理函数返回true,则会导致事件提前被消费掉,内层View将不会收到这个事件。
--View控件的事件触发顺序是先执行onTouch方法,在最后才执行onClick方法。如果onTouch返回true,则事件不会继续处理,最后也不会调用onClick方法;如果onTouch返回false,则事件继续传递。
ViewGroup是作为View控件的容器存在的,常见的ViewGroup的子类有LinearLayout、RelativeLayout、FrameLayout、ListView、ScrollView等。ViewGroup的触摸事件传递过程如下:
--触摸事件的传递顺序是由Activity到ViewGroup,再由ViewGroup递归传递给它的子View。
--ViewGroup通过onInterceptTouchEvent方法对事件进行拦截,如果该方法返回true,则事件不会继续传递给子View。
--在子View中对事件进行消费后,ViewGroup将接收不到任何事件。
本文详细解析了Android中Activity、View、ViewGroup三者之间的触摸事件传递机制,包括事件的分发、拦截与消费三个阶段。介绍了MotionEvent类及ACTION_DOWN、ACTION_MOVE、ACTION_UP三种事件类型,并解释了dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent等关键方法的作用。
1732

被折叠的 条评论
为什么被折叠?



