AndroidTouch事件的传递、拦截、消费分析
2016-12-29 10:29
274 查看
再处理一些Android点击事件的时候,由于view的叠加等原因,会有一些冲突的问题,导致一些view无法响应对应的事件。下面我讲举个例子来具体的分析下Androidtouch事件的问题。目前有这么一个需求,如下图,在RelativeLayout中嵌套一个LinearLayout,LinearLayout中有一个Button,目前的业务需求是LinearLayout具有左右滑动的效果(当然包含点击button的时候滑动也是可以的),同时在点击button的时候可以事件弹出Toast的业务需求。这样的情况下,是一个比较复杂的业务需求,在默认情况下,button的Click时间消费了改touch时间,LinearLayout是无法实现左右滑动的,那么如果解决呢,下面我门具体分析一下Touch的事件传递、拦截、消费。
Android的touch事件中,其实是不存在onClick这么一个事件的,它其实是Android封装的一个接口回调,而android具有的touch事件的方法主要有DispatchTouchEvent(),onInterceptTouchEvent(),onTouchEvent(),DispatchTouchEvent主要是进行事件的分发,onInterceptTouchEvent主要进行事件的拦截,onTouchEvent主要进行事件的判断和处理。TouchEvent有ActionDown,ActionMove,ActionUp等事件。就本次业务需求来说,想要实现LinearLayout的Move,首先touch事件由最外层的Relativelayout接收,然后执行dispatchtouchevent方法,在该方法中,RelativeLayout决定分发(默认情况下都是分发,如果不分发,则返回true,返回true表示事件就此消费,结束touch事件),然后LinearLayout获得了TouchEvent事件,这时候LinearLayout就要进行判断了,DispatchTouchEvent肯定返回false,要向下分发,因为如果在这里进行拦截,button永远获取不了touch事件,那么要在onInterceptTouchEvent()方法中进行过滤拦截,如果TouchEvent是ActionMove,那么要优先进行左右滑动的action,此时即便是点击在button上,也不想要激发click事件而是move的事件,这是就在onInterceptTouchEvent方法中返回true就可以了,会继续执行LinearLayout的onTouchEvent方法,而不会执行Button的DispatchTouchEvent方法了。而如果不是actionMove,button会执行diapatchTouchEvent-->onInterceptTouchEvent-->onTouchEvent一般在o'clock方法中都会返回true,表示事件完全消费,touch事件结束。而如果有别的业务需求,比如我除了要激发toast以外,还要执行move的行为,那么就在Button的TouchEvent中执行Toast方法,然后返回false,表示不消费事件,然后再会再执行LinearLayout的onTouchEvent方法,执行move的行为。下面在使用一个图来形象的描述本次的事件:
Android的touch事件中,其实是不存在onClick这么一个事件的,它其实是Android封装的一个接口回调,而android具有的touch事件的方法主要有DispatchTouchEvent(),onInterceptTouchEvent(),onTouchEvent(),DispatchTouchEvent主要是进行事件的分发,onInterceptTouchEvent主要进行事件的拦截,onTouchEvent主要进行事件的判断和处理。TouchEvent有ActionDown,ActionMove,ActionUp等事件。就本次业务需求来说,想要实现LinearLayout的Move,首先touch事件由最外层的Relativelayout接收,然后执行dispatchtouchevent方法,在该方法中,RelativeLayout决定分发(默认情况下都是分发,如果不分发,则返回true,返回true表示事件就此消费,结束touch事件),然后LinearLayout获得了TouchEvent事件,这时候LinearLayout就要进行判断了,DispatchTouchEvent肯定返回false,要向下分发,因为如果在这里进行拦截,button永远获取不了touch事件,那么要在onInterceptTouchEvent()方法中进行过滤拦截,如果TouchEvent是ActionMove,那么要优先进行左右滑动的action,此时即便是点击在button上,也不想要激发click事件而是move的事件,这是就在onInterceptTouchEvent方法中返回true就可以了,会继续执行LinearLayout的onTouchEvent方法,而不会执行Button的DispatchTouchEvent方法了。而如果不是actionMove,button会执行diapatchTouchEvent-->onInterceptTouchEvent-->onTouchEvent一般在o'clock方法中都会返回true,表示事件完全消费,touch事件结束。而如果有别的业务需求,比如我除了要激发toast以外,还要执行move的行为,那么就在Button的TouchEvent中执行Toast方法,然后返回false,表示不消费事件,然后再会再执行LinearLayout的onTouchEvent方法,执行move的行为。下面在使用一个图来形象的描述本次的事件:
相关文章推荐
- [置顶] Android开发知识(七):Android事件处理机制:事件分发、传递、拦截、处理机制的原理分析(上)
- android touch事件分发、拦截和响应分析
- Android Touch事件传递原理分析
- Android对touch事件的拦截,在View Tree上的传递顺序
- android事件分析(二)——MOTIONEVENT事件在ONINTERCEPTTOUCHEVENT()、ONTOUCHEVENT()中的传递顺序
- [置顶] Android开发知识(八):Android事件处理机制:事件分发、传递、拦截、处理机制的原理分析(中)
- 首先是点击事件在不同的布局层次中传递的。 理解Down事件再哪个层次被消费(拦截),后续的Move、Up的点击事件如何传递。 其中ViewGroup中onInterceptTouchEvent方法
- Android事件传递机制【Touch事件】
- Android事件传递机制【Touch事件】
- Android Touch事件传递机制解析
- Android中ViewGroup到View的Touch事件的传递机制
- Android Touch事件传递机制解析
- android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()总结
- 控件视图Android 自定义视图容器控件拦截ontouch事件传递给其子控件
- Android Touch事件分析
- Android Touch事件传递的一些总结
- Android Touch事件传递机制解析
- android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()详解二之小秘与领导的故事
- android事件传递机制以及onInterceptTouchEvent()和OnTouchEvent()详解三之ACTION_CANCEL事件和事件回传
- Android Touch事件传递机制解析