Android-三张图搞定Touch事件传递机制

news/2024/7/7 19:15:00

之前看了很多关于Android事件Touch传递机制的文章,感觉还是老外讲的最清楚。原版PDF地址:Mastering the Android Touch System,github的demo地址:demo

上图之前先讲下Android事件的基础知识:

  1. 所有的Touch事件都封装到MotionEvent里面
  2. 事件处理包括三种情况,分别为:传递—-dispatchTouchEvent()函数、拦截——onInterceptTouchEvent()函数、消费—-onTouchEvent()函数和OnTouchListener 
  3. 事件类型分为ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL等,每个事件都是以ACTION_DOWN开始ACTION_UP结束

Android事件传递流程:

  1. 事件都是从Activity.dispatchTouchEvent()开始传递
  2. 事件由父View传递给子View,ViewGroup可以通过onInterceptTouchEvent()方法对事件拦截,停止其向子view传递
  3. 如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。
  4. 如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来,也就是说ACTION_DOWN必须返回true,之后的事件才会传递进来
  5. OnTouchListener优先于onTouchEvent()对事件进行消费

效果图如下:

  1. View不处理事件流程图(View没有消费事件)
    Touch Ignore
  2. View处理事件
    Touch interest
  3. 事件拦截
    Touch Intercept

http://www.niftyadmin.cn/n/4606602.html

相关文章

iOS关于换肤和夜间模式的一些思考

介绍 好久没写文章了,正好最近在研究换肤,所以将最近的心得和体会与大家分享一下。 iOS换肤的方式比较单一,查找了很多资料,发现主流的方式有如下两种: 方式一:通过给 Category 添加属性的方式实现换肤&am…

Qt在vs2010下的配置

首先不要使用中文目录, 1 下载Qt的安装包和VS2010的Qt插件 2. 安装Qt SDK 3. 安装Qt的VS开发插件 4. 编译Qt Qt默认使用mingw进行编译,如果要使用VS2010开发,需要将Qt重新编译。 进入开始菜单Microsoft Visual Studio 2010,Visual…

ItemDecoration解析(一) getItemOffsets

介绍An ItemDecoration allows the application to add a special drawing and layout offset to specific item views from the adapters data set. This can be useful for drawing dividers between items, highlights, visual grouping boundaries and more.All ItemDecora…

The Linux I/O Stack Diagram

http://www.thomas-krenn.com/en/oss/linux-io-stack-diagram/linux-io-stack-diagram_v0.1.pdf

浅谈JavaScript的函数的call以及apply

我爱撸码,撸码使我感到快乐!大家好,我是Counter。今天就来谈谈js函数的call以及apply,具体以代码举例来讲解吧,例如有函数: function func(a, b) {return a b;} 非常简单的一个函数,返回a b 的…

C语言实现密码登录界面,你可能已被盯上!

登录界面是一个网站最重要的部分之一,一个良好的登录界面设计,将会给用户一个良好的使用体验,甚至能够引导非注册用户注册。它不仅仅在界面设计中很重要,也关系着一个网站的用户体验。今天小编用C语言写了一个简单的密码登陆界面 …

我日常的VIM

相信每一vim本书都会介绍给初学者一个叫vimtutor的,可以花几十分钟时间跟着过一边。我总结一下最近看的 移动 只列我用的比较多的命令,所有的注释都用"(vim脚本注释符) 1 h "左2 j "下3 k "上4 l "右&…

OpenCV中关于cvGetCaptureProperty函数

OpenCV中关于cvGetCaptureProperty函数OpenCV中提供了一个函数cvGetCaptureProperty(Capture* cap,int property_index)函数来获取视频文件的一些属性,这是其中的OpenCV中属性的一些宏定义:#define CV_CAP_PROP_POS_MSEC 0#define CV_CAP_PROP_POS_FRAME…