博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)Android Touch事件传递机制
阅读量:6271 次
发布时间:2019-06-22

本文共 1574 字,大约阅读时间需要 5 分钟。

-----来源: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英文原文:,示例代码:。有什么问题可以这里留言。

 

附上两张原文中流程图

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

view-ignore-touch-event-example

view-ignore-touch-event-example

 

(2) View处理事件流程图

view-process-touch-event-example

 

-----来源: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)
基本符合图上流程

转载于:https://www.cnblogs.com/xiaoyaoxia/p/4315489.html

你可能感兴趣的文章
SpringMVC无法访问根目录的问题
查看>>
使用 hooks 工程化 ionic 项目
查看>>
学习的艺术——如何学好一门技术、语言
查看>>
Javascript 中的 Array 操作
查看>>
前端之React实战-背景概述
查看>>
开坑,写点Polymer 1.0 教程第4篇——组件的生命周期
查看>>
[Leetcode] Merge Intervals and Insert Interval 合并间隔与插入间隔
查看>>
Programming Computer Vision with Python (学习笔记一)
查看>>
iOS中的单例模式
查看>>
用Pycharm创建第一个Django程序
查看>>
MySQL用户管理
查看>>
Data Structure_堆_二叉树_并查集
查看>>
「镁客早报」NASA最后一次唤醒机遇号失败; 苹果和IBM CEO加入特朗普顾问委员会 ...
查看>>
毕业五年程序员的现状:有人年薪百万,有人月薪一万 ...
查看>>
Tensorflow源码解析4 -- 图的节点 - Operation
查看>>
Springboot 2.0.x 集成基于Centos7的Redis集群安装及配置 ...
查看>>
高性能和可扩展的React-Redux
查看>>
阿里云ECS云服务器资源购买决策
查看>>
安霸Alberto Broggi :计算机视觉技术驱动自动驾驶的发展 | 2019 AI+智能汽车创新峰会 ...
查看>>
top sql(oracle)
查看>>