Android触屏事件流

安卓手势事件action_down,action_move,action_up单次点击事件的探究 1.安卓手势事件简述 就目前而言,安卓手机在使用过程中,人与手机之间的交互都是通过手指进行实现的。交互行为最常见的有ACTION_DOWN、ACTION_MOVE、ACTION_UP、ACTION_CANCEL ,ACTION_OUTSIDE以及多点触摸事件等。 2.单次点击事件的探究 创建一个项目,页面上有一个button,用于单击。一个textview用于记录事件。 btnAction.set... 阅读详情
一次触屏事件分为三个动作
ACTION_DOWN, ACTION_MOVE 和 ACTION_UP。
其中ACTION_DOWN和ACTION_UP在一次触屏事件中只会触发一次,ACTION_MOVE可能触发任意次(包括0次)。
主要响应触屏的组件有两种,一种是可以包含子元素的(ViewGroup比如LinearLayout),另一种是不能包含子元素的View(最底层的View比如Button)。
当一个触屏事件产生时,正两者的响应方法有一个主要的区别就是LinearLayout有onInterceptTouchEvent方法,而Button没有onInterceptTouchEvent方法。
1 ViewGroup(比如LinearLayout)
2 boolean dispatchTouchEvent(MotionEvent event)
3 boolean onInterceptTouchEvent(MotionEvent event)
4 boolean onTouchEvent(MotionEvent event)
5  
6 View(比如Button)
7 boolean dispatchTouchEvent(MotionEvent event)
8 boolean onTouchEvent(MotionEvent event)


总的来说,dispatchTouchEvent决定处理什么,onInterceptTouchEvent决定谁来处理,onTouchEvent决定怎么处理。所以对于Button来谁,没有小弟,自然不存在决定谁来处理的问题,故没有onInterceptTouchEvent方法

下面具体说一下这三个函数的主要作用:
dispatchTouchEvent决定处理什么,看名字就知道是事件分发,初看我还以为是分发到子元素呢,原来不是直接到子元素。其实更好的理解是这是一个过滤方法。此方法的主要作用是决定相应事件的类型。
假如dispatchTouchEvent返回false,那么在响应了ACTION_DOWN之后,后续的ACTION_MOVE和ACTION_UP均忽略,因此ACTION_MOVE和ACTION_UP永远不会有得到处理的机会。
假如dispatchTouchEvent,那么后续的ACTION_MOVE和ACTION_UP均被接受,可以被其他方法响应。

特别注意,如果在这一步的dispatchTouchEvent中没有调用super.dispatchTouchEvent(event),那么事件就到此为止,被终结了。此时此刻只有dispatchTouchEvent会响应事件,另外两个方法根本没有机会来响应事件。并且,事件不会传递到子元素中。

onInterceptTouchEvent,主要决定谁来处理(即是否拦截事件)。只要在dispatchTouchEvent中调用了super.dispatchTouchEvent(event)那么,事件(event)会被交给onInterceptTouchEvent去处理。注意,这里事件(event)是否会调用onInterceptTouchEvent与dispatchTouchEvent的返回值是true还是false无关。再次强调,dispatchTouchEvent只决定处理什么,并不能指定谁来调用。
假如onInterceptTouchEvent返回false,将事件(event)交自己的子元素处理(此时事件流是从外到内,从父元素到子元素)。
假如onInterceptTouchEvent返回true,将事件(event)交给自己的onTouchEvent来处理,并且如果有后续的ACTION_MOVE和ACTION_UP(前一步dispatchTouchEvent中返回true)的话,将不再调用onInterceptTouchEvent,直接将事件传递给自己的onTouchEvent来处理。

注意上一步,在onInterceptTouchEvent返回true的情况下,onTouchEvent将获得事件并进行具体的处理。
假如onTouchEvent返回false,将事件(event)交父元素处理,(注意在这一步,事件流反向了,此时事件流是从内到外,从子元素到父元素)。
假如onTouchEvent返回true,本次事件(event)就到此为止,被终结了。

对照上面的说法,下面给出实例说明:
01 public class MyLinearLayout1 extends LinearLayout{
02  
03     private String TAG = "第一层MyLinearLayout";
04      
05     public MyLinearLayout1(Context context) {
06         super(context);
07         this.setBackgroundColor(Color.WHITE);
08     }
09     public void setTagString(String tag){
10         TAG = tag;
11     }
12      
13     @Override
14     public boolean dispatchTouchEvent(MotionEvent event){
15         if(MotionEvent.ACTION_DOWN == event.getAction()){
16             Log.v(TAG + "dispatchTouchEvent:", "ACTION_DOWN");
17         }else if(MotionEvent.ACTION_MOVE == event.getAction()){
18             Log.v(TAG + "dispatchTouchEvent:", "ACTION_MOVE");
19         }else{
20             Log.v(TAG + "dispatchTouchEvent:", "ACTION_UP");
21         }
22         <span style="color:#e53333;">//super.dispatchTouchEvent(event);</span>      return true;
23     }
24  
25     @Override
26     public boolean onInterceptTouchEvent(MotionEvent event){super.onInterceptTouchEvent
27  
28         if(MotionEvent.ACTION_DOWN == event.getAction()){
29             Log.v(TAG + "onInterceptTouchEvent:", "ACTION_DOWN");
30         }else if(MotionEvent.ACTION_MOVE == event.getAction()){
31             Log.v(TAG + "onInterceptTouchEvent:", "ACTION_MOVE");
32         }else{
33             Log.v(TAG + "onInterceptTouchEvent:", "ACTION_UP");
34         }
35         return true;
36     }
37      
38     @Override
39     public boolean onTouchEvent(MotionEvent event){super.onTouchEvent(event)
40         if(MotionEvent.ACTION_DOWN == event.getAction()){
41             Log.v(TAG + "onTouchEvent:", "ACTION_DOWN");
42         }else if(MotionEvent.ACTION_MOVE == event.getAction()){
43             Log.v(TAG + "onTouchEvent:", "ACTION_MOVE");
44         }else{
45             Log.v(TAG + "onTouchEvent:", "ACTION_UP");
46         }
47          
48         return true;
49     }
50 }

此时没有调用super.dispatchTouchEvent(event),所以事件没有机会得到其他的处理。
打印信息:
1 第一层MyLinearLayoutdispatchTouchEvent:(460): ACTION_DOWN
2 第一层MyLinearLayoutdispatchTouchEvent:(460): ACTION_UP

如果将上面boolean dispatchTouchEvent(MotionEvent event)的返回值修改为false,那么按照前面说的,MyLinearLayout1在响应了ACTION_DOWN之后,不会再响应本次触屏操作的其他事件。所以此时的打印结果是:
1 第一层MyLinearLayoutdispatchTouchEvent:(460): ACTION_DOWN

可以看到,ACTION_UP没有被响应,因为本事件被忽略了。

现在,将super.dispatchTouchEvent(event)的注释去掉,注意,现在的boolean dispatchTouchEvent(MotionEvent event)变成下面这样:
01     @Override
02     public boolean dispatchTouchEvent(MotionEvent event){
03         if(MotionEvent.ACTION_DOWN == event.getAction()){
04             Log.v(TAG + "dispatchTouchEvent:", "ACTION_DOWN");
05         }else if(MotionEvent.ACTION_MOVE == event.getAction()){
06             Log.v(TAG + "dispatchTouchEvent:", "ACTION_MOVE");
07         }else{
08             Log.v(TAG + "dispatchTouchEvent:", "ACTION_UP");
09         }<p>        <span style="color:#e53333;">super.dispatchTouchEvent(event);//去掉注释了</span></p>
10 <p>         return true;</p>
11     }

打印信息:
1 第一层MyLinearLayout ACTION_DOWN:(783): ACTION_DOWN
2 第一层MyLinearLayout onInterceptTouchEvent:(783): ACTION_DOWN
3 第一层MyLinearLayout onTouchEvent:(783): ACTION_DOWN
4 第一层MyLinearLayout dispatchTouchEvent:(783): ACTION_UP
5 第一层MyLinearLayout onTouchEvent:(783): ACTION_UP

具体顺序为下:
1 ACTION_DOWN:ACTION_DOWN——>onInterceptTouchEvent——>onTouchEvent
2 ACTION_UP:ACTION_DOWN——>onTouchEvent
Android 事件分发机制 Android 事件分发机制一直让人头痛,之前也是面向 GitHub 编程得过且过。今天下定决心了解一下,以便后面自己定制 View 效果。Android 触摸事件有三个基本类型:ACTION_DOWN, ACTION_MOVE, ACTION_UP,后两者的传递顺序取决于 DOWN 的传递结果,所以就从 ACTION_DOWN 开始分析。 ACTION_DOWN 全景 借用一张下面参考文章里的全景图片,注意这里指的仅仅是 ACTION_DOWN 事件的传递。先解释一下: 白色... 阅读详情

相关推荐

Unity安卓游戏手柄支持实战:从输入原理到完整实现

1. 背景与核心概念 在移动游戏领域,安卓平台因其开放性和庞大的用户基数,始终是独立开发者和大型厂商的必争之地。随着玩家对游戏体验要求的不断提升,单纯依赖触屏操作的玩法已难以满足硬核玩家的需求,尤其是在第一人称射击(FPS)和角色扮演(RPG)这类对操作精度和沉浸感要求极高的游戏类型中。因此,为手游适配外接手柄,已成为提升游戏品质、拓宽玩家群体、增强市场竞争力的关键一步。 本文将以一款虚构的、但极具代表性的安卓手游《太阳天堂的钥匙》v0.9.9版本为例,深入探讨如何为一款融合了RPG元素的硬核末日生存题材F

weixin_28077113的博客 324

Android的MotionEvent和事件处理

转载:(3条消息) Android的MotionEvent和事件处理_huaxun66的博客-优快云博客_motionevent.action_move MotionEvent MotionEvent对象是与用户触摸相关的时间序列,该序列从用户首次触摸屏幕开始,经历手指在屏幕表面的任何移动,直到手指离开屏幕时结束。手指的初次触摸(ACTION_DOWN操作),滑动(ACTION_MOVE操作)和抬起(ACTION_UP)都会创建MotionEvent对象,每次触摸时候这三个操作是肯定发生的。移动过程中也

m0_56231540的博客 2516

Android触屏事件和MotionEvent介绍

本文介绍了Android系统中触屏事件的相关知识,包括触屏事件的产生,分类,触屏事件序列,以及触屏事件在代码中的表示方式。了解这些内容,是理解Android触屏事件的分发,拦截和处理的基础。

ccpat的专栏 5486

android触屏事件流

为什么80%的码农都做不了架构师?>>> ...

weixin_34406796的博客 158

unity中简单全景搭建

全景场景能够直观的展现一部分区域的全貌,在全景场景中我们能360°观看周围的景象,仿佛自身就在这个场景中,在场景的外部,我们能发现场景就是一个密封的球体,我们是处在球体的内部观察周围,在球内部观察四周看到的都是球的内表面,所以我们看到的全景其实就是贴在密封球体内的一张全景图片。接下来要介绍的就是如何在unity中用一个球体来搭建全景场景。

qq_31791999的博客 3637

完整的申请邓白氏编码的流程(手把手教你申请邓白氏编码)

申请公司的苹果开发者账号和企业级的苹果开发者账号时,都会用到邓白氏编码,也就是我们申请苹果开发者账号时需要填写的D-U-N-S Number。     申请这个邓白氏编码是免费的,但是从像华夏邓白氏公司提交申请到可以申请苹果开发者账号来用这个9位的D-U-N-S Number,需要一段时间,我申请得到D-U-N-S Number,用了8个工作日(不算周末哦)

wxw2011014003的博客 9万+

Android 事件分发

1.事件分发: 分类 Activity ,ViewGroup ,View a.Activity中包含 dispatchTouchEvent(MotionEvent ev), onTouchEvent(MotionEvent ev); b.ViewGroup中包含 dispatchTouchEvent(MotionEvent ev) ,onInterceptTouchEvent(MotionEvent ev), onTouchEvent(MotionEvent ev); c.View 中包含 dispatch

yuanhouhuohe的博客 254

在 Linux/Debian/Ubuntu 上使用 Brasero 刻录光盘

在 Ubuntu 系统中,Brasero 是一个非常方便的光盘刻录工具。无论是创建数据光盘、音频光盘还是刻录光盘镜像文件,Brasero 都能轻松胜任。本文将介绍如何在 Ubuntu 上安装和使用 Brasero 进行光盘刻录。

I AM COMING BACK... 3543

android 响应触屏事件,android触屏事件流

一次触屏事件分为三个动作ACTION_DOWN, ACTION_MOVE 和 ACTION_UP。其中ACTION_DOWN和ACTION_UP在一次触屏事件中只会触发一次,ACTION_MOVE可能触发任意次(包括0次)。主要响应触屏的组件有两种,一种是可以包含子元素的(ViewGroup比如LinearLayout),另一种是不能包含子元素的View(最底层的View比如Button)。当一个...

weixin_30315143的博客 453

在win10系统上安装opnet14.5注意事项和步聚

opnet 14.5安装避坑!

miracle_eicont的专栏 1037

3D高斯泼溅实战:如何用自采数据集训练出高质量3D模型(附COLMAP避坑指南)

本文详细介绍了使用自采数据集训练高质量3D高斯泼溅模型的完整实战流程。从数据采集规范、COLMAP稀疏重建的深度配置与避坑指南,到数据格式转换及3DGS训练调优策略,提供了针对自采数据的关键参数调整与问题排查方案,帮助读者高效构建专属3D场景。

g9h0i1的博客 976

RERAN:安卓系统的定时和点击的录制和回放——(3)

3. 方法概述  本章节主要介绍技术以及该方法优于其他录制回放工具的关键点。谷歌提供了Android软件开发工具包(SDK),包含各种工具来帮助应用程序开发人员开发、测试和调试。RERAN的开发也用到该工具。   如图4展示的高级视图,可在手机上通过安卓终端模拟器(android app市场下可下载)录制回放,也可从一台计算机通过USB连接到手机来实习录制或回放。Android调试桥(ADB),通

huayuQA的博客 1668

通信算法之267 : DJI无人机 云哨 DroneID 640ms

消费级无人机可以用于高级航拍、物流和人道主义救援等等。但是其广泛使用给安全、安保和隐私带来了许多风险。例如,攻击方可能会使用无人机进行监视、运输非法物品,或通过侵入机场上方的封闭空域造成经济损失。为了防止恶意使用,无人机制造商采用多种对策来强制安全可靠地使用无人机,例如对速度和高度施加软件限制,或使用地理围栏实施禁飞区。作为对传统对策的补充,市场领导者大疆(DJI)为无人机实施了一种称为 DroneID 的跟踪协议,该协议旨在将无人机及其操作员的位置传输给授权实体,例如执法部门或关键基础设施的运营商。

leegang12的专栏 3307

adb、monkey

这里写目录标题二级目录三级目录Monkey的概念:Monkey的介绍 一级目录 二级目录 三级目录 Monkey的概念: “猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人(就像猴子一样)不需要知道程序的任何用户交互方面的知识,如果给他一个程序,他就会针对他看到的界面进行操作,其操作是无目的的、乱点乱按的。 这种测试方式在产品周期中的早期阶段会找到很多很好的bug,为用户节省不少的时间。 Monkey的介绍 它是Android系统自带一个命令行工具,可以运行在模拟器里或者真是设备中运行。 monke

都是一些小知识,有错请见谅 728

一文搞懂数据标注

数据标注即通过分类、画框、标注、注释等,对图片、语音、文本等数据进行处理,标记对象的特征,以作为机器学习基础素材的过程。简言之,就是需要给数据做好标注,这样机器就能知道学习哪些内容。

女王の专属领地 9936

PCL 基于超体素的点云分割【2024最新版】

点云超体素分割原理介绍、代码实现以及如何做到将每一个超体素内的点进行单独保存而不造成点云缺失的方法。博客长期更新,本文最近一次更新时间为:2024年12月29日。

点云侠的博客 36万+

丧心病狂的Monkey测试

Monkey的概念: “猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人(就像猴子一样)不需要知道程序的任何用户交互方面的知识,如果给他一个程序,他就会针对他看到的界面进行操作,其操作是无目的的、乱点乱按的。 这种测试方式在产品周期中的早期阶段会找到很多很好的bug,为用户节省不少的时间。 Monkey的介绍 它是Android系统自带一个命令行工具,可以运行在模拟器里或者真是设备中运行。 monkey向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行压力测试。 monkey包括很多选项,大

金玉满堂的博客 429

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Monkey和Monkey Server

Monkey是作为压力测试的一个测试工具,俗称“搞怪测试”。 常用命令: adb shell monkey -p 包名 -v -v 100 --执行100次的随机测试,-v代表输出日志的级别 Monkey脚本编写: type= raw events count= 10 speed=1.0 start data >> #启动Activity LaunchActivity(cn.comein.test,cn.comein.entry.activity.LauncherActivity

436

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

关于父view拦截触屏事件

昨天在开发中遇到了这样的问题:

qiqiname1989的专栏 864

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

一个简单的monkey测试工具

Monkey的概念: “猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人(就像猴子一样)不需要知道程序的任何用户交互方面的知识,如果给他一个程序,他就会针对他看到的界面进行操作,其操作是无目的的、乱点乱按的。 这种测试方式在产品周期中的早期阶段会找到很多很好的bug,为用户节省不少的时间。 Monkey的介绍 它是Android系统自带一个命令行工具,可以运行在模拟器里...

just__like的博客 10万+

android 触摸 事件,Android触屏事件和MotionEvent详解

Android屏幕操作屏幕是用户和Android设备交互的主要媒介,屏幕分为触屏和非触屏。Android设备目前有四种类型:Android Phone,Android Tablet,Android Wear和Android TV。Android TV大都使用非触屏,其他三类设备则大都使用触屏。对非触屏设备,用户可以通过键盘鼠标或遥控器在屏幕上操作。对触屏设备,用户主要通过手指或触控笔等工具在屏幕上...

weixin_39942335的博客 3408

android触屏事件处理onInterceptTouchEvent

android官方文档有个标准解释,现摘录过来:首先,看Android的官方文档正解 onInterceptTouchEvent()与onTouchEvent()的机制:   1. down事件首先会传递到onInterceptTouchEvent()方法   2. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之return fals...

iteye_6980的博客 359

安卓开发中监测触屏事件的使用

// 监测触屏事件 public boolean dispatchTouchEvent(MotionEvent event) { int actionType = event.getAction(); switch (actionType) { case MotionEvent.ACTION_UP: { if (mGnCommplatform.checkLocalEnviron

cuihao1234的专栏 1382

Monkey工具的使用

Monkey工具的使用 Monkey的概念: “猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人(就像猴子一样)不需要知道程序的任何用户交互方面的知识,如果给他一个程序,他就会针对他看到的界面进行操作,其操作是无目的的、乱点乱按的。 这种测试方式在产品周期中的早期阶段会找到很多很好的bug,为用户节省不少的时间。 Monkey的介绍 它是Android系统自带一个命令行工具,可以运行在模拟器里或者真是设备中运行。 monkey向系统发送伪随机的用户事件流,实现对正在开发的...

qq_43649501的博客 746

Android Event事件流分析

一、前言:         最近太忙了,因此好久没空来写博客了,差点让大家以为荒废了。。嘻嘻,这不,今天忙里偷个闲,来写这篇文章,帮助自己,也是帮助大家深入了解Event事件流的整个过程,涉及到的文件有:ViewRoot(Impl),ViewGroup,View,PhoneWindow.DecorView及Activity。这些文件,我会抽空将我的理解写到博客。 二、事件流: 2.1 Vie

小小青叶 4870
上一篇: Android事件处理的两种模型
下一篇: 仿写 微信 界面
coding_or_coded
博客等级 码龄16年 216粉丝 115原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值