再处理一些Android点击事件的时候,由于view的叠加等原因,会有一些冲突的问题,导致一些view无法响应对应的事件。下面我讲举个例子来具体的分析下Androidtouch事件的问题。目前有这么一个需求,如下图,在RelativeLayout中嵌套一个LinearLayout,LinearLayout中有一个Button,目前的业务需求是LinearLayout具有左右滑动的效果(当然包含点击button的时候滑动也是可以的),同时在点击button的时候可以事件弹出Toast的业务需求。这样的情况下,是一个比较复杂的业务需求,在默认情况下,button的Click时间消费了改touch时间,LinearLayout是无法实现左右滑动的,那么如果解决呢,下面我门具体分析一下Touch的事件传递、拦截、消费。

AndroidTouch事件的传递、拦截、消费分析_第1张图片


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的行为。下面在使用一个图来形象的描述本次的事件:


AndroidTouch事件的传递、拦截、消费分析_第2张图片

更多相关文章

  1. Linux ubuntu repo安装方法
  2. Android商城开发(一)——一次活动页需求引发的危机感
  3. 为android开放类增加自定义成员方法
  4. Android测试方法总结汇总
  5. Android项目源码混淆问题解决方法
  6. (转)Android从服务器端获取数据的几种方法
  7. Android socket通信 readline方法阻塞
  8. android 监控软键盘确定 搜索 按钮并赋予点击事件

随机推荐

  1. 【Android自助餐】Handler消息机制完全解
  2. 精通android2第一章学习
  3. Android数据库ORMlite框架翻译系列(第一章
  4. Android(安卓)网络处理
  5. Android 技术-- 图形系统详解
  6. Android开发人员必须掌握的10 个开发工具
  7. [Android]LayoutInflater的inflate方法半
  8. Android(安卓)Support Design Library之C
  9. 64位ubuntu 11.10下android开发环境的搭
  10. okhttp3 拦截器源码分析