Android中Touch事件传递总结

TouchEvent

TouchEvent 分三种事件:down、move、up。

其中move事件在一个操作中(这里说的一个操作就是用户与屏幕的交互,即由down到up的动作序列)可能会发生多次。
但是,我们认为一个动作序列会包含以上三种事件,因此,在事件处理中就是要处理好这个过程,而最重要的就是down事件,这是一个动作序列的起始,没有down谈不上后面的事件了。
所以,我们把消耗down事件的类当做是这个动作序列的最终载体。

如果Down事件不归你处理,那这个动作序列的move,up也不归你处理。

他们的触发顺序会是这样:

ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP

Touch事件传递的相关方法

android系统中的几乎所有View的子类都具有下面三个和TouchEvent处理密切相关的方法:

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

//这个方法用来拦截TouchEvent
//只有ViewGroup包含此方法,普通view不包含方法
 public boolean onInterceptTouchEvent(MotionEvent ev)

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

onTouchEvent、onTouch

OnTouchListener接口是用来处理手机屏幕事件的监听接口,需要实现该接口的onTouch事件/OnClick事件来设置触发事件,然后我们可以通过setOnTouchListener()为任何需要的View的子类添加该监听器。

那么OnTouchListener接口中的onTouch方法 和 Touch事件的传递有什么关系呢?

在onTouchEvent的源码中有这样一段:

if (li != null && li.mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
           li.mOnClickListener.onClick(this);
            return true;
        }

若我们又注册了onClick监听,则在onTouchEvent中就会执行该监听,同时返回true。

若没有注册onClick监听,顶层view的onTouchEvent默认返回false,其他层view的onTouchEvent默认返回true。

因此,如果onTouch返回了true,则事件被消费掉,就不再执行onTouchEvent了,更别说onClick监听了。如果onTouch返回false,那么会继续执行onTouchEvent,再执行onClick监听,若onTouchEvent中返回了true,则事件被消费掉,不再往下层view传递。

结论:onTouchListener的onTouch方法优先级比onTouchEvent高,会先触发。假若onTouchListener中的onTouch方法返回true,表示此次事件已经被消费了,那onTouchEvent是接收不到消息的。假如onTouch方法返回false,会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。内置诸如click事件的实现等等都基于onTouchEvent,假如onTouch返回true,这些事件将不会被触发。

Touch事件传递简易的流程图:

结合图来看过程:

如果返回值是 Super.dispatchTouchEvent ,意味着由onInterceptTouchEvent决定事件流向。

如果调用了Super.dispatchTouchEvent。 这样就会继续调用onInterceptTouchEvent事件。因此如果需要多个控件同时处理,则一定需要返回true,并调用Super.dispatchTouchEvent

也就是说想要把事件传递给子view,则Super.dispatchTouchEvent 是必不可少的。

任何view的onTouch或者onTouchEvent方法返回了true,则表示该事件就已经到此被消费掉了,不再往下传递。

其他:

  • Down事件在onInterceptTouchEvent()后返回true,则传递到onTouchEvent,当其返回true时,本次动作序列的后续事件不会再通过onInterceptTouchEvent了,而是在dispatchTouchEvent中直接传递于onTouchEvent。也就是说后续事件直接默认被该view的dispatchTouchEvent分发至onTouchEvent。
  • Down事件在onTouchEvent后返回false后导致本次事件没有被消费掉,则向上传递到父view的onTouchEvent,若返回true,则后续的move、up事件直接由父view的dispatchTouchEvent传递给自己的onTouchEvent,而不经过父view的onInterceptTouchEvent,后面的子view自然接收不到Touch事件。
  • onInterceptTouchEvent默认返回false,顶层view的onTouchEvent默认返回false,其他view的onTouchEvent默认返回true。
  • 如果我们在一个View中同时覆写了onClick、onLongClick及onTouchEvent的话,onTouchEvent是最先捕捉到ACTION_DOWN和ACTION_UP事件的,其次才可能触发onClick或者onLongClick。

GestureDetector手势识别类

通过重写View.OnTouchListener接口的onTouch(View v, MotionEvent event)方法,我们可以处理一些简单的touch事件,但是这个方法并不能识别手势,如果需要处理一些复杂的手势,用这个接口就会很麻烦(因为我们要自己根据用户触摸的轨迹去判断是什么手势)。好在Android为我们提供了GestureDetector类,通过它,我们可以轻松的进行手势识别。

为View和Activity加入手势操作的步骤如下:

1、为View或者Activity实现OnGestureListener接口,覆写需要的手势的回调方法。

2、创建一个GestureDetector对象mygesturedetector,设置其监听器。

3、覆写View或者Activity的OnTouchEvent方法,调用或返回mygesturedetector.onTouchEvent(ev),将事件交给mygesturedetector处理。

非常好的参考资料:

http://www.cnblogs.com/ghj1976/archive/2012/04/13/2445561.html  消息分发知识基础

http://ipjmc.iteye.com/blog/1694146     Android事件处理

http://www.longdw.com/touchevent-android/  Android的ViewGroup中事件的传递机制

 

时间: 2024-09-28 07:35:22

Android中Touch事件传递总结的相关文章

android中的事件传递和处理机制

一直以来,都被android中的事件传递和处理机制深深的困扰!今天特意来好好的探讨一下.现在的感觉是,只要你理解到位,其实事件的 传递和处理机制并没有想象中的那么难.总之,不要自己打击自己,要相信自己能掌握这块知识.好了,下面是我今天的收获,希望也 能对你有一点帮助. 一.拟人化来理解android中的事件机制 其实android中的事件传递与处理机制跟我们生活中的事件处理是一样的.这里有一个生活中的例子,很能说明这个问题.阐述如下: 你是一个公司的员工,你的上头有一个主管,主管上头呢还有一个经

Android中的事件传递机制

Android源码版本:API Level 19(Android 4.4) Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都由如下三个部分作为基础: 按下(ACTION_DOWN) 移动(ACTION_MOVE) 抬起(ACTION_UP) 所有的操作事件首先必须执行的是按下操作(ACTIONDOWN),之后所有的操作都是以按下操作作为前提,当按

Android中Touch事件的传递机制

由于之前对于android的事件传递机制不了解,今天正好不忙,赶紧抽出时间来理一下这方面的知识,本文结合demo,对android的事件传递机制进行分析. 在事件传递过程中,离不开以下三个方法: 1.dispatchTouchEvent 分发touchEvent,返回值为true时表示TouchEvent被当前View处理,事件不会向下层传递(包括后续的onInterceptTouchEvent和onTouchEvent), dispatchTouchEvent会收到后续的ACTION_MOVE

Android Touch事件传递机制详解 上

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/37961997 最近总是遇到关于Android Touch事件的问题,如:滑动冲突的问题,以前也花时间学习过Android Touch事件的传递机制,可以每次用起来的时候总是忘记了,索性自己总结一下写篇文章避免以后忘记了,其实网上关于Touch事件的传递的文章真的很多,但是很少有系统性的,都是写了一个简单的demo运行了一下,对于我们了解Android Touch事件基本上没有任何帮助. 今

Android中的事件分发机制

1. 一个小问题引发的思考 2. 通过源码探索View中的事件分发机制 3.通过源码探索ViewGroup的事件分发机制 最近的一个项目中涉及,布局为一个RelativeLayout包含了一个EditText和一个Button,当点击EditText时,弹出软键盘,点击RelativeLayout中除了EditText和Button之外其它的地方时,收起软键盘. 实现起来很简单,为EditText和RelativeLayout分别注册一个onTouch事件,为Button注册一个click事件,

Android touch 事件传递机制

前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事件进行拦截.这个时候我们就需要明白android touch 事件传递机制, (2)以前很多时候比较模糊,也许是网上看到也有很多事件传递的相关文章,但我看着头晕,解释不彻底,有的说得一半,总算不满足不满意,于是据我自己的理解来彻底的来整理下具体的是怎么个传递方式,分享给大家,希望大家看到有什么不对的

【转】Android Touch事件传递机制解析

原文地址:http://www.cnblogs.com/runssnail/p/4250549.html 说明:本文在原文地址上有所改动 一.小故事 在讲正题之前我们讲一段有关任务传递的小故事,抛砖迎玉下: 话说一家软件公司,来一个任务,分派给了开发经理去完成 开发经理拿到,看了一下,感觉好简单,于是 开发经理:分派给了开发组长 开发组长:分派给了自己组员(程序员) 程序员:分派给了自己带的实习生. 实习生:好苦逼,无法分派,怎么办啊?只能自己干了 但是实习生能不能做好,有两种情况了. 情况一:

android Touch事件传递小结

这次还是先贴上测试代码吧.. 主布局文件是个三层结构,最外层和中间层都是LinearLayout的子类,里层是个TextView: <com.example.touchevent.OutterLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/o

Android Touch事件传递机制引发的血案

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38942135 关于Android Touch事件传递机制我之前也写过两篇文章,自觉得对Touche事件还是理解得比較清楚的,可是近期遇到的一个问题,让我再次对Android Touche事件进行一次学习. 我的关于Android Touche事件传递机制的文章例如以下: http://blog.csdn.net/yuanzeyao/article/details/37961997 http