Android中Touch手势分发

在android中的Touch分发中,经常可以看到从ACTION_DOWN->ACTION_MOVE->ACTION_UP,当我们不了解它是如何分发的话总感觉一头雾水,所以有必要了解它的整体分发过程,所以很有必要好好的记录下。

事件分发函数

public
void dispatchTouchEvent(MotionEvent ev).

public
void onInterceptTouchEvent(MotionEvent ev).

public
void onTouchEvent(MotionEvent ev).

整体的Touch分发我们需要从这三个分发函数中来了解其分发顺序,其中的onInterceptTouchEvent函数只有ViewGroup中才特有的函数。我们根据每个分发的函数中return的结果来判断是否需要继续往上分发改Touch事件。

在我们需要测试Touch分发的地方写入log来进行研究其结果.

首先我们定义两个ViewGroup分别extends
LinearLayout并分别在dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent写入log,如下<由于都是简单的log写入所以只举例说明>:

public boolean dispatchTouchEvent(MotionEvent ev) {
		int action = ev.getAction();
		switch (action) {
		case MotionEvent.ACTION_DOWN:
			Log.i(TAG, "--- dispatchTouchEvent -> action_down");
			break;
		case MotionEvent.ACTION_MOVE:
			Log.i(TAG, "--- dispatchTouchEvent -> action_move");
			break;
		case MotionEvent.ACTION_UP:
			Log.i(TAG, "--- dispatchTouchEvent -> action_up");
			break;
		case MotionEvent.ACTION_CANCEL:
			Log.i(TAG, "--- dispatchTouchEvent -> action_cancle");
			break;
		}
		return super.dispatchTouchEvent(ev);
	}

然后我们继续自定个TouchButton extends Button也如上重写了dispathTouchEvent
和 onTouchEvent方法,然后再Activity中也写上这两个方法,我们主要通过log来分析分发手势,大致的界面布局为:

1.在Activity ParentLayout TouchButton中都按默认的分发的情况下:

可以看到在默认情况是按Activity-ParentLayout-ChildLayout-TouchButton来进行分发,且在TouchButton中return true,所以我们可以看出手势分发是从activity往上分发手势,在默认情况下成功的在TouchButton中消耗掉,在dispathTouchEvent中down move up中任何一个地方返回true 那么该手势就不会往下分发直接在本控件内消耗了。

2.当在ParentLayout中的onInterceptTouchEvent中的ACTON_DOWN中返回true的时候:

如果在onInterceptTouchEvent中被拦截了 导致事件无法继续传递下去  且 无法接收到继续的move 和 up事件,所以最终的时间仍然回到了activity消耗了。

3.当我们在onInterceptTouchEvent中的ACTION_MOVE中返回true的话:

会分发cancle事件下去给child和button 然后把事件传递给ontouchevent 且 child和button无法接收到move和up事件,这种情况下我们最经常需要到,很多情况下都是拦截该分发手势来进行移动从而达到自定义ViewGroup的滑动效果。

最后说两句:

我们根据dispathTouchEvent来分发手势,如果在该方法中就return true的情况下 那么接下来的手势只能在本View或者Activity消耗了,反之最后的手势会在TouchButton中消耗掉。

在onInterceptTouchEvent的move中返回true的话那么上层的View只能接收到ACTION_CANCLE事件而不会受到任何别的事件,最终在本ViewGroup中消耗了。

时间: 2024-10-12 23:22:46

Android中Touch手势分发的相关文章

Android中的事件分发机制(下)——View的事件处理

综述 在上篇文章Android中的事件分发机制(上)--ViewGroup的事件分发中,对ViewGroup的事件分发进行了详细的分析.在文章的最后ViewGroup的dispatchTouchEvent方法调用dispatchTransformedTouchEvent方法成功将事件传递给ViewGroup的子View.并交由子View进行处理.那么现在就来分析一下子View接收到事件以后是如何处理的. View的事件处理 对于这里描述的View,它是ViewGroup的父类,并不包含任何的子元

Android中的事件分发机制——ViewGroup的事件分发

综述 Android中的事件分发机制也就是View与ViewGroup的对事件的分发与处理.在ViewGroup的内部包含了许多View,而ViewGroup继承自View,所以ViewGroup本身也是一个View.对于事件可以通过ViewGroup下发到它的子View并交由子View进行处理,而ViewGroup本身也能够对事件做出处理.下面就来详细分析一下ViewGroup对时间的分发处理. MotionEvent 当手指接触到屏幕以后,所产生的一系列的事件中,都是由以下三种事件类型组成.

Android的Touch事件分发机制简单探析

前言 Android中关于触摸事件的分发传递是一个很值得研究的东西.曾不见你引入了一个ListView的滑动功能,ListView就不听你手指的指唤来滚动了:也不知道为啥Button设置了onClick和onTouch,其中谁会先响应:或许你会问onTouch和onTouchEvent有什么区别,又该如何使用?这里一切的一切,只要你了解了事件分发机制,你会发现,解释这都不是事儿! 相关Touch事件的方法 1.public boolean dispatchTouchEvent(MotionEve

android中的事件分发和消费机制

一.思维导图 查看大图:http://img.blog.csdn.net/20150524191211931 二.更多参考 Android中的Touch事件处理:http://www.cnblogs.com/mengdd/p/3394345.html Android 编程下 Touch 事件的分发和消费机制 :http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html Android事件分发完全解析之为什么是她:http://blog

Android中的事件分发机制

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

Android中的手势

Android对两种手势行为提供了支持:1.对于第一种手势行为而言,Android提供了手势检测,并为手势检测提供了相应的监听器.2.对于第二种手势行为,Android允许开发者添加手势,并提供了相应的API识别用户手势. GestureDetector.OnGestureListener就是一个监听器.负责对用户的手势行为提供相应.boolean onDown(MotionEvent e):当触碰事件按下时触发该方法.boolean onFling(MotionEvent e1,MotionE

Android中Touch事件传递总结

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

【转】Android中的事件分发和处理

原文链接:http://www.apkbus.com/home.php?mod=space&uid=705730&do=blog&id=61207 上次跟大家分享了一下自定义View的一下要点,这次跟大家聊一下View的事件分发及处理,为什么主题都是View,因为作为一名初级应用层Android工程师,跟我打交道最多的莫过于各种各样的View,只有详细了解他们各自的习性,才能更好地跟他们沟通交流,做出自己想要的效果. 基础储备 View.MotionEvent 我们都能详细地说出A

Android中Touch事件的传递机制

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