作为一名真正的开发者,解决事件冲突不可避免的,作为同行,我希望大家一定要搞懂他的原理才能自如的解决冲突,刚开接触解决事件冲突的时候,通过百度搜索论坛看了很多博客,越看越糊涂,有通过图解的,有通过代码测试上传日志的,更有甚至上传源代码的,我的神啦,源代码,对于刚接触事件的学习者来说,我想阅读代码的能力并不高,本来是解决一个难问题的,又雪上加霜,加入了源代码,难上加难,常人说的,猫吃浆糊越吃越然,哈哈,言归正传,本博客就是让大家很简单的理解安卓开发的事件传递机制。
//分派事件
public boolean dispatchTouchEvent(MotionEvent ev)
//拦截事件
public boolean onInterceptTouchEvent(MotionEvent ev)
//处理事件
public boolean onTouchEvent(MotionEvent event)
上面就是跟Touch有关的三个方法,已经标的很清楚了,三个功能分派事件,拦截事件,处理事件,而相关的类有Activity,View,ViewGroup。ViewGroup拥有以上三个方法(也就是能当容器的控件,LiearLayout等等),Activity、View(比如button)拥有分派事件和处理事件两个方法,这个要记住。
事件如何传递的大家去搜着看,就是一级级传递给子view,分发顺序为dispatchTouchEvent --- onInterceptTouchEvent --- onTouchEvent
大家注意这三个方法返回值都是布尔类型的,就从这个上做文章讲解:
1、分派事件
返回值为true——事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费,同时事件会停止向下传递;
返回值为false——表示事件停止传递,并返回,交给上级的onTouchEvent处理;
返回super.dispatchTouchEvent(ev)——事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。
现在轮到拦截事件出场了
2、拦截事件
返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理;
返回 false,则表示将事件放行,当前 View 上的事件会被传递到子 View 上,再由子 View 的 dispatchTouchEvent 来开始这个事件的分发;
3、处理事件
如果接收到要处理事件的命令,开始处理,有两种结果
返回true,则表示事件当前View自己处理并消费;
返回false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,上层还是返回false,那么一直向上返回,也就是大家说的冒泡。