Android开发(四)Touch事件机制

Android中处理touch事件的两个方法:onInterceptTouchEvent()和onTouchEvent()。

onInterceptTouchEvent()是ViewGroup的一个方法,目的是在系统向该ViewGroup及其各个childView触发onTouchEvent()之前对相关事件进行一次拦截,由于ViewGroup会包含若干childView,因此需要能够统一监控各种touch事件的机会,因此纯粹的不能包含子view的控件是没有这个方法的,如LinearLayout就有,TextView就没有。

Touch事件在该view以及子view之间的传递取决于onInterceptTouchEvent()和onTouchEvent()的返回值,onInterceptTouchEvent()的默认值为false,onTouchEvent()的默认值父view为false,最底层的子view为true,返回true表示本view可以解决touch事件。

  • onInterceptTouchEvent决定是否把事件传递给子view进行处理,true表示不传递,自己处理,那么子view就不会接收到touch事件。
  • onTouchEvent决定是否把时间传递传递给父view进行处理,true表示不传递,那么父view就接收不到touch事件。

再来看一下onInterceptTouchEvent和onTouchEvent事件的传递顺序,假设三个view A、B、C,A包含B,B包含C,那么oninterceptTouchEvent的传递顺序为A->B->C,onTouchEvent的顺序为C->B->A。

看个列子:

布局:Linelayout1包含Linelayout2,Linelayout2包含EWSwipeListView

 

Activity使用该布局,并且初始化EWSwipeListView的数据:

EWSwipeListView继承自ListView:

LineLayout1和LineLayout2继承自LineLayout,重写了onInterceptEvent()和onTouchEvent():

 

第一次运行,所有的返回值按照默认的:

 

onInterceptTouchEvent传递到了EwSwipeListView,被onTouchEvent消费掉,LineLayout1和LineLayout2都不能接收到onTouchEvent事件。

第二次运行,把LineLayout2的onInterceptTouchEvent返回值改成true:

Linelayout2的onInterceptTouchEvent返回了true,那么EWSwipeListView就不会收到任何事件,这里LineLayout2的onTouchEvent返回了false,把事件传递给了LineLayout1的父view,这种LineLayout2的onInterceptToucheEvent返回true,同时onTouchEvent返回false,导致之后的Move和Up事件也接收不到。

第三次运行,把LineLayout2的onTouchEvent返回改成true:

这样LineLayout1的onTouchEvent就不会被触发,并且LineLayout2的Move和Up事件都能接受到。

此条目发表在Android分类目录。将固定链接加入收藏夹。

发表评论