事件传递机制总结

事件系统组成元素:

1. 每一个事件被包装为一个MotionEvent

2. 描述一个事件的位置(location)

--ACTION_DOWN

--ACTION_UP

--ACTION_MOVE

--ACTION_POINTER_DOWN

--ACTION_POINTER_UP

--ACTION_CANCEL

3.事件的元数据包括

--事件的位置(location)

--第几个手指(多点触摸事件)

--事件发生的时间

4.触摸事件开始于ACTION_DOWN结束于ACTION_UP

事件传递系统:

(1) 事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。子View可以通过onTouchEvent()对事件进行处理。

(2) 事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递。

(3) 如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。

(4) 如果View没有对ACTION_DOWN进行消息,之后的其他事件不会传递过来。

(5) OnTouchListener.onTouch()优先于onTouchEvent()对事件进行消费。

自定义View事件处理注意事项;

1. 处理事件

[email protected]  onTouchEvent()方法

--提供一个OnTouchlistener

2. 消费事件

-- 返回TRUEwith ACTION_DOWN表示消费了该事件

-- 其他事件返回TRUE仅仅是阻止后续action事件传递

3. ViewConfiguration类中一些有关的方法

(ViewConfigurationconfiguration = ViewConfiguration.get(context);获得一个ViewConfiguration对象)

--getScaledTouchSlop() 获得能够进行手势滑动的最短距离.如果小于这个距离就不触发移动控件事件.

--getScaledMinimumFlingVelocity()获得允许执行一个Fling手势动作的最小速度值

--getLongPressTimeout()是用于检测是不是长按的时间,默认为500毫秒

4.调用dispatchTouchEvent()方法避免直接调用onTouchEvent()

5.如果是ViewGroup可以拦截事件

TouchDelegate委派处理View事件

实例:

1.设定一个长方形区域

Rect bounds =
new
Rect(0, 0, getMeasuredWidth(), getMeasuredHeight());

2.设置长方形为点击生效区域,委派处理点击事件的View

TouchDelegatedelegate =
new TouchDelegate(bounds, mButton);

setTouchDelegate(delegate);

多指触摸事件处理

--MotionEvent.getPointerCount()得到目前屏幕上的触点数(ACTION_MOVE)

--使用ACTION_POINTER_DOWN和ACTION_POINTER_UP来监听多点触控操作。多点触控有用的方法。这两个事件需要结合MotionEvent.getActionMasked(),MotionEvent.getActionIndex()两个方法来处理.

getActionMasked()表示可以获取用于多点触控检测点的事件。而在1.6和2.1中并没有event.getActionMasked()这个方法,其实他就是把event.getAction()&MotionEvent.ACTION_MASK封装了一下。

getActionIndex().获取多点事件中的索引,即表示是哪一个手指触发的事件

更多介绍见:

http://developer.android.com/reference/android/view/MotionEvent.html

http://stackoverflow.com/questions/13546376/how-to-use-multitouch-properly-purpose-of-motionevent-getactionindex

事件传递机制总结

时间: 2024-12-13 04:21:00

事件传递机制总结的相关文章

Android touch 事件传递机制

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

Android中事件传递机制的总结

事件传递虽然算不上某个单独的知识点,但是在实际项目开发中肯定会碰到,如果不明白其中的原理,那在设计各种滑动效果时就会感到很困惑. 关于事件的传递,我们可能会有以下疑问: 事件是如何传递的 事件是如何处理的 自定义view的时候,事件也冲突了怎么解决 带着这三个疑问,我们来总结一下事件传递机制是怎么回事. 一.事件分发的原理: 1.事件是如何传递的: (1)首先由Activity分发,分发给根View,也就是DecorView(DecorView为整个Window界面的最顶层View) (2)然后

Android ViewGroup 触摸事件传递机制

引言 上一篇博客我们学习了Android View 触摸事件传递机制,不了解的同学可以查看Android View 触摸事件传递机制.今天继续学习Android触摸事件传递机制,这篇博客将和大家一起探讨ViewGroup的触摸事件传递机制. 示例 示例代码如下: public class MainActivity extends ActionBarActivity { private String TAG = "MainActivity"; private MyViewGroup pa

Android View 触摸事件传递机制

PS:以现在的眼光看以前写的博客感觉写的很烂,或许或一段时间再看现在的博客会有同样的感觉.所以每时每刻都去学习,去发现和理解新的东西. 引言 由于之前写的一篇关于Android事件传递顺序的博客质量太差,可能是理解不到位的原因,故最近又花了许多时间再次去看Android源码,看完之后有了新的理解,所以打算重新整理这篇博客.理解Android触摸事件传递机制有助于日后的开发以及自定义一些手势效果等.注意:这篇博客是基于Android2.0源码来分析的,不管老版本还是新版本的Android,其内部触

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

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

事件分发,事件消费,事件传递机制

0.学习目的: 1.解决开发中点击冲突,滑动冲突 drawerLayout点击穿透 viewpager嵌套viewpager左右滑动的时候冲突 2.深入了解Android事件机制 1.事件 1.事件包括:点击,双击,长按,滑动,拖拽,多点触控,组成了Android的事件 2.事件动作组成: 1.ACTION_DOWN 按下事件, 所有的事件都是从按下开始的 2.ACTION_MOVE 移动事件 ,按下后移动 3.ACTION_UP 弹起事件, 手指离开 3.事件的传递过程 按下(屏幕) -- 系

Android Touch事件传递机制详解 上

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

android事件传递机制详解

本篇内容将结合Android源码来分析Android的事件传递机制.众所周知,点按.滑动.触摸构成了Android等智能设备的基本操作,几乎所有的应用都通过对触摸屏的操作来进行应用程序的使用.那么,在Android中,触摸事件是如何响应及传递的呢,通过本篇内容你将有一个初步的了解. 实验环境 OS X 10.9 Eclipse(ADT) Android源码版本:API Level 19(Android 4.4) Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点

Android事件传递机制(转)

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

深入探索 ViewGroup 的事件传递机制

引言: ListView 中嵌套按钮,按钮点击事件无效,将按钮 setFocusable(false) 后才能正常使用点击事件的情况相信许多开发者都遇到过,很多人可能找到一个解决办法就把这个问题抛在了一边,但题主本着探索的精神从源码的角度找到了问题的答案 如果没有看过 深入理解 View 的事件传递机制 ,看今天的内容可能会有些吃力,所以建议大家还是先去看看我的这篇文章啦. 废话不多说,进入正题: 一.概述 ViewGroup 事件传递机制 研究 ViewGroup 之前,我们不妨先想一想:Vi