简述android触屏事件的处理_移动端touch事件有哪些

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Android屏幕操作

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

Android屏幕交互事件

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

  1. key event
    键盘、遥控器按键,鼠标点击会生成按键事件(key event)
  2. hover event
    鼠标在屏幕上的停留、滑动会产生hover event
  3. scroll event
    鼠标滚轮的滚动会生成scroll event
  4. 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信息
    通过getPointerCount()方法获取此事件产生时pointer的个数,它一定是大于等于1的。例如有两个手指接触在屏幕上,则getPointerCount()为2。
    通过getPointerId(int pointerIndex)获取pointerIndex对应的pointer id。
    通过findPointerIndex(int pointerId)获取pointerId对应的pointer index。
    通过getX(int pointerIndex),getY(int pointerIndex)方法来获取此事件产生时pointerIndex对应的pointer在屏幕上的相对位置。
    通过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的相关信息。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195325.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深入理解JVM—JVM垃圾回收机制[通俗易懂]

    深入理解JVM—JVM垃圾回收机制[通俗易懂]垃圾回收是指不定时去堆内存中清理不可达对象。不可达的对象并不会马上就会直接回收,垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,程序员唯一能做的就是通过调用System.gc方法来建议执行垃圾收集器,但其是否可以执行,什么时候执行却都是不可知的。这也是垃圾收集器的最主要的缺点。当然相对于它给程序员带来的巨大方便性而言,这个缺点是瑕不掩瑜的。先谈一下新生代与老年代根据垃圾回…

    2022年5月20日
    37
  • ntp服务器ntp协议时间戳,计算机的时钟(一):NTP 协议[通俗易懂]

    ntp服务器ntp协议时间戳,计算机的时钟(一):NTP 协议[通俗易懂]本系列文章主要介绍计算机系统中时钟的处理。主要内容包含NTP,Lamport逻辑时钟,向量时钟,TrueTime等。本文是第一篇,介绍NTP协议。电脑的时钟不知道你注意过没有,假如隔了好几天打开你的电脑,任务栏的时间依然是显示正确的,即使你的电脑没有联网,这是如何做到的?post-quartz.png计算机的主板上有一个石英晶体振荡器和一个纽扣电池。石英晶体振荡器的频率是32768Hz每秒。在通电…

    2022年10月12日
    0
  • process returned -1073741571_0x0000007a电脑蓝屏

    process returned -1073741571_0x0000007a电脑蓝屏前言C++运行报错:Processreturned-1073741819(0xC0000005)是真的坑!!!申请的内存没有释放new后必须deletemalloc后必须free创建内核对象(比如CreateFile,CreateMutex,CreateThread),后必须释放内核对象句柄.创建内存映射文件,CreateFileMapping,MapViewOfFile后必须…

    2022年10月4日
    0
  • html content属性_HTTP函数

    html content属性_HTTP函数关于HttpEntity的用法HttpEntity表示http的request和resposne实体,它由消息头和消息体组成。从HttpEntity中可以获取http请求头和回应头,也可以获取http请求体和回应体信息。HttpEntity的使用,与@RequestBody、@ResponseBody类似。HttpEntity的典型应用是配合RestTemplate,在微服务项目中的应用(参见API示例)用户登录示例:步骤一:在login.jsp发送ajax请求,发送之前添加请求头信息

    2022年10月23日
    0
  • 分页 模糊查询「建议收藏」

    分页 模糊查询「建议收藏」一、所有的web项目都会用到分页显示和模糊查询,对于有些人不知道该怎么写二、今天我用springMVC和myBatis写的分页和模糊分享给大家,不喜勿喷三、数据库是mysql四、其实写分页就是新建一个分页的类,定义页码每页数量共几页当前页数总数量五、判断多少页,获取总数量除以每页显示的数量,有余数+1页六、sql语句就是用…

    2022年5月11日
    42
  • 大学最应该学习的 5 门课, 毕业后大厂 Offer 直接拿到手软!「建议收藏」

    大学最应该学习的 5 门课, 毕业后大厂 Offer 直接拿到手软!「建议收藏」时间如白驹过隙,我竟然已经是一名拥有13年编程经验的老油条了!有些自豪,因为自己从大一就开始学习的Java语言依然坚挺,几乎是编程语言中的霸主了;但也有些遗憾,大学的时候没有把这些计算机基础课程学好,有些甚至没有学,导致工作后有很长一段时间蛮吃力的,全靠近些年“废寝忘食”的补课,才有所好转。希望学弟学妹们,能从我这些经验中获得一些启发,少走一些弯路。1)计算机编程的基石——数据结构与算法2)计算机编程语言的母胎——C语言3)计算机组成原理4)计算机操作系统5)计算机网络一、数据结构

    2022年4月29日
    58

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号