Android触摸事件流程剖析

Android中的触摸事件流程就是指MotionEvent如何传递,主要包括两个阶段: ide

一、onInterceptTouchEvent触摸事件拦截方法传递,从外到里传递 this

二、onTouchEvent触摸事件处理方法传递,从里到外传递 spa

如今作一个例子探索触摸事件的流程,效果图以下: .net

image

从外到里的视图依次是ViewGroup一、ViewGroup二、View。 3d

ViewGroup1的触摸相关方法以下(ViewGroup2相似): 日志

private boolean intercept = false;//拦截方法返回的标志位,是否拦截触摸事件  @Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.e("touch", "MyViewGroup1 return " + this.intercept + " onInterceptTouchEvent " + ev.toString()); return this.intercept; } private boolean handle = false;//触摸处理方法返回的标志位,是否处理触摸事件  @Override public boolean onTouchEvent(MotionEvent event) { Log.e("touch", "MyViewGroup1 return " + this.handle + " onTouchEvent " + event.toString()); return this.handle; }
View的触摸相关方法以下(View并无onInterceptTouchEvent方法):
private boolean handle = false;//触摸处理方法返回的标志位,是否处理触摸事件  @Override public boolean onTouchEvent(MotionEvent event) { Log.e("touch", "MyView return " + this.handle + " onTouchEvent " + event.toString()); return this.handle; }

如今点击中间的View,Log日志以下: code

image

总结1:在onInterceptTouchEvent和onTouchEvent中都返回false时,MotionEvent的ACTION_DOWN会走一遍传递和处理流程,而后就再没有传递进来了。 事件

下面修改ViewGroup2触摸事件拦截方法的标志位而且截图Log日志 get

image

总结2:在触摸事件传递的过程当中,若是遇到了一个onInterceptTouchEvent返回true,那么表示再也不往下传,直接今后View的onTouchEvent返回。 it

然而,咱们发现只有ACTION_DOWN事件传进来了,其余类型的触摸都不会进来了,缘由是在全部的onTouchEvent中都返回了false,也就是他们都表示不会去处理这一次的触摸事件,因此系统就不会自做多情再传触摸事件进来了。

要想系统不断的传递触摸事件进来,只能在某一个onTouchEvent中返回true,修改ViewGroup2的onTouchEvent标志位并截图Log日志

image

总结3:当某个onTouchEvent返回true而且触摸事件传递到这个方法时,表示本身要处理这个触摸事件,再也不向上传递;后来的其余类型的触摸事件仍是会走一下onInterceptTouchEvent(但不会走到已经在处理触摸事件的View以及以后的View的onInterceptTouchEvent),而后再传给正在处理触摸事件的View的onTouchEvent方法,而且此时也不会再向上传递。

因此咱们能够获得一些很是宝贵而且很是经常使用的技巧:

一、在onTouchEvent中处理咱们须要作的触摸事件,而且返回true。

二、在onInterceptTouchEvent中获取ACTION_DOWN、ACTION_MOVE、ACTION_UP等触摸事件(可能只是获取其中一两种触摸事件),而后判断是否知足拦截的条件,在此以前返回false,一旦知足则返回true。

源代码下载:http://www.oschina.net/action/code/download?code=54575&id=80556

相关文章
相关标签/搜索