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



更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. Android(安卓)UI学习1:控件和基本事件的响应
  5. Android(安卓)onTouchEvent, onClick及onLongClick的调用机制
  6. Android(安卓)-- Layout布局文件里的android:layout_height等属
  7. Linux ubuntu repo安装方法
  8. Android初识之简易计算器
  9. Android(安卓)事件分发

随机推荐

  1. (Java)出现/消失JPanel中的JLabel仅在调整
  2. 在Java中,使用DefaultSelenium对象在selen
  3. Eclipse Java开发环境的搭建
  4. java通过映射取得方法对一个类的变量进行
  5. JavaScript基础——变量、作用域和内存问
  6. 如何让我的基本SWT应用程序在Mac OS X 10
  7. 老农过河问题
  8. Fragment中出现java.lang.NullPointerExc
  9. java.nio.ByteBuffer的flip、rewind和com
  10. 实现<table>标签的动态新增和后台接受<ta