您的位置:首页 > 移动开发 > Android开发

android Touch事件传递机制深入剖析

2014-09-23 16:31 471 查看
在使用各种应用的时候,手指触摸屏幕上的组件就会产生一系列的事件,这个过程中触摸事件是如何传递的呢?解析如下:

android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE。。。->ACTION_MOVE->ACTION_UP

android的事件处理分为3步。

1.public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent

2.public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent

3.public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent

dispatchTouchEvent分发事件

当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View, TouchEvent最先到达最顶层 view 的 dispatchTouchEvent方法。然后由 dispatchTouchEvent 方法进行分发,如果dispatchTouchEvent返回true ,则交给这个view的onTouchEvent处理,如果dispatchTouchEvent返回
false ,则交给这个 view 的 onInterceptTouchEvent方法来决定是否要拦截这个事件,

如果onInterceptTouchEvent返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果onInterceptTouchEvent返回 false ,那么就传递给子 view,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。

事件拦截:onInterceptTouchEvent

onInterceptTouchEvent用于改变事件的传递方向。决定传递方向的是返回值,返回为false时事件会传递给子控件,返回值为true时事件会传递给当前控件的onTouchEvent(),这就是所谓的Intercept(拦截)。

正确的使用方法是,在此方法内仅判断事件是否需要拦截,然后返回。即便需要拦截也应该直接返回true,然后由onTouchEvent方法进行处理。

onTouchEvent用于处理事件,返回值决定当前控件是否处理完了这个事件。尤其对于ACTION_DOWN事件,返回true,表示我想要处理后续事件(ACTION_MOVE或者ACTION_UP);返回false,表示不关心此事件,并返回由父类进行处理。

在没有重写onInterceptTouchEvent()和onTouchEvent()的情况下(他们的返回值都是false),

当某个控件的onInterceptTouchEvent()返回值为true时,就会发生截断,事件被传到当前控件的onTouchEvent();

以上是我个人的一些研究,弄懂了事件分发传递的原理对我们自定义组件或实现其它功能是很有帮助的,具体代码就没有贴出来了,如果文章中有什么不对的地方,希望大家能在评论中指出,以便及时更改!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: