安卓开发当中,总有一些这种情况,为什么listview拖动没有效果,为什么按钮或者控件点击没有效果。为什么图片不能拉动等,这都是事件分发机制的问题;所以,事件分发机制的目的,就是为了处理各种事件,或者动作而产生的。
接下来,我将带大家一步一步解析这个流程:
在解析流程之前,先带大家,了解一下一些基本的动作:
我们平时操作手机,一般是由三个动作组成过程,按下,移动,抬起,在安卓中,这些动作,都是封装在类MotionEvent 中,可以获取到相应的动作操作;
在我们接下来要讲的各种方法中调用; 事件的分发处理,是分DOWN,MOVE,UP,三个过程分别去处理;举个例子:比如在一个ViewGroup中,就是DOWN的时候处理玩某个viewGroup的dispatchTouchEvent--onInterceptTouchEvent--onTouchEvent这整个流程,才会轮到MOVE动作。来重新处理整个流程,最后UP来处理整个流程;
事件分发事件的处理比较复杂,如果你能慢慢看文字或者找资料。也许也能看的懂,但是过段事件就可能又忘记了。所以,小淇哥我弄了一个图来给整个事件机制一个概述,让大家有一个大概的了解,然后再一步一步讲解:
我们可以看到整个流程图。涉及到三个层,由上至下:activity---viewGroup---view层,这里的viewGroup可以是由多个的;
整个流程就是一个U型图,事件处理,先由左边的从上至下,再由右边的从下至上的处理过程:
另外:事件处理机制主要由dispatchTouchEvent--onTouchEvent两个过程,这个是基本过程。其中,在viewGroup中,还有一个事件拦截过程
onInterceptTouchEvent
重点详细解析:
1在activity层:这个层只有dispatchTouchEvent方法和onTouchEvent,若dispatchTouchEvent不进行事件分发了,就不会执行下面的onTouchEvent操作,而且,别的层也一样道理;
若你的点击没有碰到任何ViewGroup和View才会执行onTouch方法(当然,后面讲到下面的viewGroup和View返回为false,也会执行这个方法,这里可以先不管)
2若你的点击事件有三层的话,activity的dispatchTouchEvent返回True的时候,事件进行分发;
走到了viewGroup的流程,在viewGroup若进行onInterceptTouchEvent的返回为true的时候,就可以拦截到点击事件了。并且在viewGroup的onTouchEvent处理,后面View的就接收不到该事件了。
同理:只要是Down的拦截返回为true,后面的Move,和Up事件也不会经过onInterceptTouchEvent,拦截了一次。就不用拦截了。也就是不用经过该方法了;若ViewGroup没有进行拦截,就会返回到View的事件分发方法dispatchTouchEvent,和onTouchEvent方法;而这里要重点介绍的是一个U型过程的重下至上的,就是如果View的onTouchEvent没有被消费,就会返回false,就会轮到上一层的ViewGroup判断,是否需要消费;如果返回true,就会在该层进行消费掉,不进行上传。就是这个意思;
这里是截图。你们可以拿我的demo去一个一个试试!
共同学习,写下你的评论
评论加载中...
作者其他优质文章