Android UI事件传递(Touch事件)
来源:互联网 发布:simon口语 知乎 编辑:程序博客网 时间:2024/04/29 22:57
Android的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件。
一个最简单的屏幕触摸动作触发了一系列Touch事件,最基本的有三个:ACTION_DOWN、ACTION_MOVE和ACTION_UP。一次Touch事件即从ACTION_DOWN到ACTION_UP的整个过程。
对于有子View的ViewGroup类,其触摸事件会经历一系列的分发处理过程。其中,最基本的处理方法有三个:dispatchTouchEvent(),onInterceptTouchEvent()以及onTouchEvent()。
(1)public boolean dispatchTouchEvent(MotionEvent ev) — 分发TouchEvent
(2)public boolean onInterceptTouchEvent(MotionEvent ev) — 拦截TouchEvent
(3)public boolean onTouchEvent(MotionEvent ev) — 处理TouchEvent
当TouchEvent发生时,Activity首先会将TouchEvent传递给最顶层的View(即DecorView,所有View的根View)。TouchEvent最先到达根View的dispatchTouchEvent,然后由dispatchTouchEvent方法进行分发:
(a)如果dispatchTouchEvent返回true,则交给这个View的onTouchEvent处理(消耗掉了);
(b)如果dispatchTouchEvent返回false,则交给这个View的interceptTouchEvent方法来决定是否要拦截这个事件——
(c)如果interceptTouchEvent返回true,也就是拦截掉了(同样消耗掉了),则交给它的onTouchEvent来处理;如果interceptTouchEvent返回false,那么就将事件传递给子View,由子View的dispatchTouchEvent再来开始这个事件的分发。如此循环下去,直到得到合适的处理为止。
如果事件传递到某一层的子View的onTouchEvent上、并且这个方法返回了false,那么该事件会从这个View往上传递(往父类传递),并且都是onTouchEvent接收。如果父类的onTouchEvent仍旧返回false,则继续往上传递,直到某一层的onTouchEvent能够处理为止(返回true),或者所有onTouchEvent都返回为false(此时,这个事件就会“消失”,并且接收不到下一次事件)。
小结:
1. 在Touch事件的分发过程中,若返回值为true,则表示该事件被“消耗”了(或者说是被拦截了,得到处理了);若返回值为false,则表示该事件没有被消耗;
2. 若dispatchTouchEvent方法和interceptTouchEvent方法均返回false,则需要将事件往下传递(父View到子View);但如果是onTouchEvent方法返回false,则需要将事件往上传递(子View到父View);
3. 如果按照上述分发流程处理,结果还是没有消耗掉本次事件,则系统不会给你下一次事件,因为它会认为这次的事件阻塞了,没必要再给下一次。
原文链接:http://androidll.iteye.com/blog/1553558
- Android UI事件传递(Touch事件)
- android touch事件传递
- Android Touch事件传递
- Android touch事件传递
- Android touch 事件传递
- Android Touch事件传递
- Android Touch事件传递
- Android-UI-事件传递
- Android Touch事件传递机制
- Android Touch事件传递机制
- android keydown touch事件传递
- Android Touch事件传递机制
- Android Touch事件传递机制
- Android Touch事件传递机制
- Android Touch事件传递机制
- Android Touch事件传递机制
- Android Touch事件传递机制
- Android Touch事件传递机制
- 如何使用iOS AddressBook
- 二级c++数据结构
- JavaDoc的学习笔记
- s3c24xx中的MPLL和UPLL
- 调用DirectDraw7接口对象
- Android UI事件传递(Touch事件)
- 关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决
- 链表相邻元素翻转
- 关于CLOSE BY CLIENT STACK TRACE
- C#调用DLL时参数问题
- Unity3d 支持的图形格式和大小优化
- php 获取 multipart/form-data 的raw data
- maven环境快速搭建
- adb shell 无法启动 (insufficient permissions for device)