我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android触屏事件和MotionEvent详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android触屏事件和MotionEvent详解

Android屏幕操作

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

Android屏幕交互事件

用户在设备屏幕上的所有操作都会转换为各类屏幕交互事件。Android屏幕交互事件主要有如下几种类型。

  • key event 键盘、遥控器按键,鼠标点击会生成按键事件(key event)
  • hover event 鼠标在屏幕上的停留、滑动会产生hover event
  • scroll event 鼠标滚轮的滚动会生成scroll event
  • touch event 对触屏设备,当用户用手指或触控笔在设备屏幕上操作时会产生触屏事件(touch event)。

为了方便理解和简化描述,后文在介绍时会统一用手指操作来代指所有的触屏操作。例如“当手指接触屏幕时产生此事件”,并不表示只能用手指接触屏幕才会产生此事件,而是需要理解为“当手指,触控笔等工具接触屏幕时都会产生此事件”。

触屏事件类型

按照动作来分,可以将触屏事件可以分为以下三类

  1. 手指按到屏幕上
  2. 手指在屏幕上移动
  3. 手指离开屏幕

其中手指按到屏幕上和手指离开屏幕一定是成对出现的,在这中间会出现不定次数的手指在屏幕上移动的事件。

触屏事件序列

在Android系统中,从手指按到屏幕上开始,到手指离开屏幕,这个过程中产生的一系列触屏事件构成了一个事件序列(也可以称为事件流)。对多点触屏事件,则是从第一个手指按到屏幕上开始,到最后一个手指离开屏幕为止。

一个触屏事件序列第一个事件一定是手指按到屏幕上,最后一个事件一定是手指离开屏幕。用户在设备屏幕上的所有触屏操作最终都会转换为若干个这样的事件序列。

理解触屏事件序列的概念非常重要,Android中对触屏事件的处理很多时候需要以事件序列为单位进行考察。

Android触屏事件在代码中的表示

在Android系统中使用MotionEvent对象来表示一个触屏事件,当用户用手指在屏幕上操作时,会产生一系列的MotionEvent对象。但是需要注意的是,产生了一个MotionEvent对象并不表示这一定是一个触屏操作,MotionEvent不仅可以用来表示touch event,还可以表示hover event,scroll event。也就是说,除了key event之外的其他屏幕交互事件都用MotionEvent来表示(key event用KeyEvent对象表示)。

在MotionEvent类中将产生此次事件的动作称为motion,将产生此动作的主体(如手指,鼠标等)称为pointer。一个MotionEvent对象中可以包含一个或多个pointer,每个pointer都包含id,index,位置,大小,方向等属性。在一个触屏事件序列的多个事件中,同一个pointer拥有相同的id,但是index可以不同。

这里只讨论MotionEvent中关于touch event的部分。在MotionEvent对象中主要包含了如下信息:

1.操作类型(action code)

MotionEvent提供了getActionMasked()方法来获取此次操作的类型,它是一个int型数值。除了getActionMasked()外还有一个getAction()方法,它和getActionMasked()的区别会在后面介绍。

在MotionEvent类中定义了一系列的int常量来表示各种预定义的操作类型。列举如下。

事件类型常量 含义说明
ACTION_DOWN 当手指接触屏幕时产生此事件,在多点触摸时,只有第一个手指接触屏幕时才会产生此事件,中间其他手指接触屏幕不会产生此事件。它表示一个触屏事件序列的开始。
ACTION_UP 当手指离开屏幕时产生此事件,在多点触摸时,只有最后一个手指(这个手指并不一定是产生ACTION_DOWN事件的那个手指)离开屏幕时才会产生此事件,中间其他手指离开屏幕不会产生此事件。它表示一个触屏事件序列的结束。
ACTION_MOVE 当手指在屏幕上滑动时产生此事件, 在多点触摸时,每个手指的滑动都会产生一个此事件
ACTION_POINTER_DOWN 只有在多点触摸时才会产生此事件,在一个触屏事件序列中,除第一个接触屏幕的手指外,其他手指接触屏幕时会产生此事件。
ACTION_POINTER_UP 同样只有在多点触摸时才会产生此事件,在一个触屏事件序列中,除最后一个离开屏幕的手指外,其他手指离开屏幕时会产生此事件。
ACTION_CANCEL 这个事件比较特殊,它和上述事件都不一样,上述事件都是由用户在屏幕上操作所触发的,但是这个事件是由系统自动产生的。当一个事件序列需要提前终止的时候由系统自动产生此事件。正常来说,一个事件序列应该以最后一个手指离开屏幕,也就是ACTION_UP作为结束,但是在某些情况下,事件序列需要被提前终止。这通常是因为处理这个事件序列的View对象的Parent对象在事件序列结束之前主动拦截了后续的事件。此外,如果处理这个事件序列的View对象从窗口中被移除了,它也会收到ACTION_CANCEL事件。例如处理这个事件序列的View对象所在的Activty被finish(),所在的Dialog被dismiss(),或者被其Parent View Remove了。在这些情况下,虽然这时手指还停留在屏幕上,但View对象将无法再接收到后续的触屏事件,这时它会收到ACTION_CANCEL事件,表示事件序列由于外在原因需要提前终止。

结合上面触屏事件序列的描述可以知道,一个正常的触屏事件序列一定是以ACTION_DOWN为开始,以ACTION_UP为结束,中间可以有0个或多个ACTION_MOVE, 如果是多点触摸,中间还会有若干次的ACTION_POINTER_DOWN和ACTION_POINTER_UP。ACTION_POINTER_DOWN和ACTION_POINTER_UP一定是数量相对的。

一个提前终止的触屏事件序列一定是以ACTION_DOWN为开始,以ACTION_CANCEL为结束,中间可以有0个或多个ACTION_MOVE, 如果是多点触摸,中间还会有若干次的ACTION_POINTER_DOWN和ACTION_POINTER_UP。ACTION_POINTER_DOWN和ACTION_POINTER_UP的数量可能不同。

getAction()和getActionMasked()的区别:对ACTION_POINTER_DOWN和ACTION_POINTER_UP之外的事件,getAction()返回值和getActionMasked()是相同的。对ACTION_POINTER_DOWN和ACTION_POINTER_UP,getAction()返回值和getActionMasked()返回值稍有不同。getAction()返回值包含了操作类型和产生此事件的pointer对应的pointer index两个信息,其中低8位代表操作类型,高8位代表pointer index 。

2.pointer信息

  1. 通过getPointerCount()方法获取此事件产生时pointer的个数,它一定是大于等于1的。例如有两个手指接触在屏幕上,则getPointerCount()为2。
  2. 通过getPointerId(int pointerIndex)获取pointerIndex对应的pointer id。
  3. 通过findPointerIndex(int pointerId)获取pointerId对应的pointer index。
  4. 通过getX(int pointerIndex),getY(int pointerIndex)方法来获取此事件产生时pointerIndex对应的pointer在屏幕上的相对位置。
  5. 通过getRawX(),getRawY()方法来获取此事件产生时pointerIndex对应的pointer在屏幕上的绝对位置。不带参数的重载方法表示获取pointerIndex为0的pointer在屏幕上的位置。

除此之外,还有getToolMajor(),getToolMinor(),getTouchMajor(),getTouchMinor(),getOrientation()等方法获取pointer的区域大小,方向等信息。由于实际使用的较少,这里就不做介绍了。

3.操作时间

可以通过MotionEvent类的getEventTime()方法来获取此事件产生的时间。

4.事件序列的历史数据

在MotionEvent对象中还会保存其所在的事件序列的一些历史事件的信息,可以通过getHistorySize()获取历史事件记录的条数,通过一系列的getHistoricalXXX()方法获取历史事件的信息。由于ACTION_DOWN 是一个事件序列的开始,所以ACTION_DOWN对应的事件对象中是不会有历史事件记录的,在这之后的事件对应的MotionEvent对象中会有0到多个的历史事件信息的记录,具体记录的个数并不固定,总的数量也不会太多。

在上述信息中,使用比较多的是前两条,也就是事件的类型和事件产生时pointer的相关信息。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android触屏事件和MotionEvent详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android触屏事件和MotionEvent详解

Android屏幕操作屏幕是用户和Android设备交互的主要媒介,屏幕分为触屏和非触屏。Android设备目前有四种类型:Android Phone,Android Tablet,Android Wear和Android TV。Andro
2023-05-30

Android触摸事件的应用详解

前言上一篇讲了Android触摸事件的传递机制,具体可以看这里初识Android触摸事件传递机制。既然知道Android中触摸事件的传递分发,那么它能解决什么样的问题,在我们实际开发中如何应用,这点很重要,知道原理是为了解决问题而准备的。这
2023-05-31

Android触摸屏事件怎么设置

在Android中,可以通过以下步骤来设置触摸屏事件:创建一个继承自View的自定义视图类,例如TouchView。public class TouchView extends View {// 构造方法public TouchView(C
2023-10-23

详解Android截屏事件监听

1. 前言 Android系统没有直接对截屏事件监听的接口,也没有广播,只能自己动手来丰衣足食,一般有三种方法。利用FileObserver监听某个目录中资源变化情况利用ContentObserver监听全部资源的变化监听截屏快捷按键 由于
2022-06-06

Android MotionEvent中getX()和getRawX()的区别实例详解

Android MotionEvent中getX()和getRawX()的区别实例详解 实例代码:public class Res extends Activity implements View.OnTouchListener { Bu
2022-06-06

Android 的触摸事件详解及示例代码

由于触摸(Touch)而触发的事件 Android的事件:onClick, onScroll,onFling等等,都是由许多个Touch组成的。其中Touch的第一个状态肯定是ACTION_DOWN,表示按下了屏幕。之后,touch将会有后
2022-06-06

Android触屏事件的处理方式是什么

Android触屏事件的处理方式是通过监听和响应触摸事件来实现。具体来说,可以通过以下几种方式来处理触屏事件:1. 在Activity或Fragment中重写onTouchEvent()方法,通过判断MotionEvent的动作类型来处理触
2023-08-11

Android触摸事件传递图解

本博文讲解流程 TouchEvent相关事件简介 流程图分解讲解 总结与归纳一.TouchEvent相关事件简介 android TouchEvent相关事件有 1 dispatchTouchEvent 这个方法用来分发TouchEve
2022-06-06

Android入门之onTouchEvent触碰事件的示例详解

今天给大家带来的是TouchListener与OnTouchEvent的比较,以及多点触碰的知识点! 文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2022-12-08

Android亮屏和熄屏控制实例详解

本文实例讲述了Android亮屏和熄屏控制实现方法。分享给大家供大家参考,具体如下: 一、概述 我们的Android应用程序很多需要和亮屏和熄屏打交道,比如闹钟的时候,需要保持亮屏,之后又需要熄屏。那么今天,我们来分析下这方面的功能。 二.
2022-06-06

Android 的回调事件详解

看见网上一些回调的解释都很复杂的,特别基于Android的自定义回调,感觉一头雾水,于是乎,我也写了这篇基于我对回调的解释。 先来看一个简单的例子: 有两个类 ClassA ,和 ClassB, ClassA调用ClassB里面的方法,pu
2022-06-06

Node.JS事件的绑定与触发示例详解

Node中的事件模型就是我们常见的订阅发布模式,Nodejs核心API都采用异步事件驱动,所有可能触发事件的对象都是一个继承自EventEmitter类的子类实例对象,这篇文章主要给大家介绍了关于Node.JS事件的绑定与触发事件的相关资料,需要的朋友可以参考下
2022-11-16

详解Android事件的分发、拦截和执行

在平常的开发中,我们经常会遇到点击,滑动之类的事件。有时候不同的view之间也存在各种滑动冲突。比如布局的内外两层都能滑动的话,那么就会出现冲突了。这个时候我们就需要了解Android的事件分发机制。 Android的触摸事件分发过程由三
2022-06-06

Android dataBinding与ListView及事件详解

今天来了解一下Android最新给我们带来的数据绑定框架——Data Binding Library。数据绑定框架给我们带来了更大的方便性,以前我们可能需要在Activity里写很多的findViewById,烦人的代码也增加了我们代码的耦
2022-06-06

js中的触发事件对象event.srcElement与event.target详解

在JavaScript中,事件对象是在事件发生时自动创建的,它包含有关事件的信息,例如事件类型、事件的目标元素等。在IE浏览器中,事件对象有一个属性叫做srcElement,它指向触发事件的元素。而在其他浏览器中,事件对象有一个属性叫做ta
2023-08-08

Android recycleView的应用和点击事件实例详解

Android recycleView的应用和点击事件 效果图:长按是删除: 下面代码: MainActivity 类public class MainActivity extends AppCompatActivity {Recycler
2022-06-06

Android 触摸事件监听(Activity层,ViewGroup层,View层)详细介绍

Android不同层次的触摸事件监听 APP开发中,经常会遇到有关手势处理的操作,比如向右滑动返回上一个页面。关于触摸事件的处理,我们可以大概处理在不同的层次上。 Activity层:可以看做触摸事件获取的最顶层 ViewGro
2022-06-06

android 键盘事件和屏幕事件的运行原理及交互实现

当在自定义View或者做游戏的时候,我们常常会用到键盘触发事件和屏幕触发事件!在自定义的View里的键盘触发事件(比如:onKeyDown(int keyCode, KeyEvent event))和屏幕触发事件(onTouchEvent(
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录