-----来源:http://www.trinea.cn/android/touch-event-delivery-mechanism/

介绍Android Touch事件的传递机制

不少朋友私信问到这个问题,那就推荐一篇我看到的对传递机制介绍最清楚的国外文章吧。本文略作翻译。

1、基础知识

(1) 所有Touch事件都被封装成了MotionEvent对象,包括Touch的位置、时间、历史记录以及第几个手指(多指触摸)等。

(2) 事件类型分为ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL,每个事件都是以ACTION_DOWN开始ACTION_UP结束。

(3) 对事件的处理包括三类,分别为传递——dispatchTouchEvent()函数、拦截——onInterceptTouchEvent()函数、消费——onTouchEvent()函数和OnTouchListener

2、传递流程

(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优先于onTouchEvent()对事件进行消费。

上面的消费即表示相应函数返回值为true。

更多请直接阅读PDF英文原文:Mastering the Android Touch System,示例代码:Demo@Github。有什么问题可以这里留言。

附上两张原文中流程图

(1) View不处理事件流程图

view-ignore-touch-event-example

(2) View处理事件流程图

-----来源:http://www.trinea.cn/android/touch-event-delivery-mechanism/

标注:touch的事件流自己简单做了个demo验证:(Demo地址:https://github.com/alicx/leaf8/tree/androidDemo)

touch事件从Activity的Dispatch开始传递给ViewGroup的Dispatch,在ViewGroup的Dispatch中会先调用onInterceptTouchEvent,

A1: 如果该方法返回true,则表示ViewGroup将拦截该Touch事件,后续将直接调用ViewGroup的OnTouchListener/OnTouchEvent(*标1*onTouchListener总是会优先
onTouchEvent方法调用,如果前者返回true则后者将不会被调用)。
A2:如果该方法返回false,则将会继续传递给View的Dispatch,View作为子节点没有Intercept方法,将直接执行OnTouchListener/OnTouchEvent(如上标1)
基本符合图上流程

最新文章

  1. PAT
  2. WM (Constants)
  3. web前端开发(3)
  4. cocos2d-x3.x使用rapidjson
  5. Hibernate 缓存机制二(转)
  6. Enze Third day(c#中选择结构【if...else】)
  7. 学习Jammendo代码的心路历程(二)ViewFlipper数据的填充
  8. 一大波jQuery事件即将来袭!
  9. FreeType in OpenCASCADE
  10. PHP开发api接口安全验证
  11. ubuntu下cmake 使用clang
  12. C# string数组转int数组(转载)
  13. VS 2017 激活码
  14. Equivalent Sets HDU - 3836 2011多校I tarjan强连通分量
  15. [js]js设计模式-修改原型
  16. HDUOJ-------The Hardest Problem Ever
  17. 【ARM】2410裸机系列-流水灯
  18. PHP:第一章——PHP中的数组运算符和类运算符
  19. PHP Token(令牌)设计 避免重复提交
  20. (14)如何使用Cocos2d-x 3.0制作基于tilemap的游戏:第二部分

热门文章

  1. 常见的HTTPS攻击方法
  2. SQL Server 中的嵌套事务与@@TranCount(转)
  3. Pie(二分)
  4. Linux kernel ‘key_notify_policy_flush’函数信息泄露漏洞
  5. redis数据过期策略【转】
  6. 动态规划:NOI 2009 管道取珠
  7. 数学(组合,容斥):COGS 1220. 盒子与球
  8. Matlab计算机视觉/图像处理工具箱推荐
  9. Safecracker(搜索)
  10. Java中的数据类型及相互转换方法