,,Android触屏事件和MotionEvent详解

,,Android触屏事件和MotionEvent详解

本文主要介绍Android触屏事件和MotionEvent的相关资料,希望本文能帮助你了解和掌握这部分内容,有需要的朋友可以参考一下。

Android屏幕操作

屏幕是用户与Android设备交互的主要媒介。屏幕分为触摸屏和非触摸屏。目前有四种类型的Android设备:Android手机、Android平板电脑、Android Wear和Android TV。Android多采用非触摸屏,其他三类设备多采用触摸屏。对于非触摸屏设备,用户可以通过键盘、鼠标或遥控器在屏幕上进行操作。对于触摸屏设备,用户主要通过手指或触摸笔等工具在屏幕上进行操作,但也可以通过键盘、鼠标和轨迹球等外部工具进行操作。

Android屏幕交互事件

设备屏幕上的所有操作都会转换成各种屏幕交互事件。安卓屏幕交互事件主要有以下几种。

按键事件键盘、遥控器按键、鼠标点击都会产生按键事件。

当鼠标在屏幕上悬停和滑动时,会产生悬停事件。

滚动事件鼠标滚轮的滚动产生一个滚动事件。

触摸事件对于触摸屏设备,当用户用手指或触笔在设备的屏幕上操作时,将会产生触摸事件。

为了便于理解和简化描述,在下面的介绍中,手指操作将用于指代所有触摸屏操作。比如“手指触摸屏幕时产生该事件”并不意味着只有手指触摸屏幕时才会产生该事件,而应该理解为“手指、手写笔等工具触摸屏幕时才会产生该事件”。

触屏事件类型

根据动作,触摸屏事件可以分为以下三类

将手指按在屏幕上。

在屏幕上移动手指。

手指离开屏幕

其中手指按在屏幕上和手指离开屏幕一定是成对的,手指在屏幕上移动的事件会有无限个。

触屏事件序列

在Android系统中,从手指按在屏幕上到手指离开屏幕的过程中产生的一系列触摸屏事件构成一个事件序列(也叫事件流)。对于多点触摸事件,它从第一个手指按下屏幕开始,到最后一个手指离开屏幕结束。

触摸屏事件序列的第一个事件必须是手指按下屏幕,最后一个事件必须是手指离开屏幕。用户屏幕上的所有触摸屏操作,最终都会转换成几个这样的事件序列。

理解触摸屏事件序列的概念非常重要,Android中触摸屏事件的处理往往需要从事件序列的角度来考察。

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

在Android系统中,用MotionEvent对象来表示一个触摸屏事件,当用户用手指在屏幕上操作时会产生一系列的MotionEvent对象。不过需要注意的是,生成了MotionEvent对象并不代表一定是触摸屏操作。MotionEvent不仅可以用来表示触摸事件,还可以表示悬停事件和滚动事件。即除了KeyEvent之外的所有屏幕交互事件都由MotionEvent表示(key event由key event对象表示)。

在MotionEvent类中,生成该事件的动作称为运动,主体(如手指、鼠标等。)产生这个动作的就叫指针。MotionEvent对象可以包含一个或多个指针,每个指针包含id、索引、位置、大小、方向等属性。在触摸屏事件序列的多个事件中,相同的指针具有相同的id,但是索引可以不同。

这里只讨论MotionEvent中关于触摸事件的部分。MotionEvent对象主要包含以下信息:

1.操作类型(action code)

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

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

事件类型常数

意义解释

动作_向下

当手指触摸屏幕时会生成此事件。在多点触摸中,只有当第一个手指触摸屏幕时,才会生成此事件,而当其他手指触摸屏幕中间时,不会生成此事件。它代表触摸屏事件序列的开始。

行动_行动

当手指离开屏幕时会生成此事件。在多点触摸中,只有当最后一个手指(这个手指不一定是生成ACTION_DOWN事件的手指)离开屏幕时,才会生成此事件,中间的其他手指离开屏幕时,不会生成此事件。它表示触摸屏事件序列的结束。

动作_移动

当手指在屏幕上滑动时会产生这个事件,多点触控时每个手指滑动都会产生一个事件。

动作_指针_向下

仅当执行多点触摸时,才会生成此事件。在触摸屏事件序列中,当除第一个手指之外的其他手指触摸屏幕时,会生成该事件。

动作_指针_向上

同样,只有在执行多点触摸时,才会生成此事件。在触摸屏事件序列中,当除了最后一个手指之外的其他手指离开屏幕时,将生成该事件。

操作_取消

这个事件很特别。与上述事件不同。以上事件都是用户在屏幕上操作触发的,但是这个事件是系统自动生成的。当事件序列需要提前终止时,该事件由系统自动生成。正常情况下,事件序列应该在最后一个手指离开屏幕时结束,即ACTION_UP,但在某些情况下,事件序列需要提前终止。这通常是因为处理该事件序列的视图对象的父对象在事件序列结束之前主动截取后续事件。此外,如果处理此事件序列的视图对象从窗口中移除,它也将接收ACTION_CANCEL事件。例如,处理这个事件序列的视图对象的Activty是finish(),对话框是dismiss(),或者它的父视图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()的返回值包含两条信息:操作类型和生成该事件的指针对应的指针索引,其中低8位表示操作类型,高8位表示指针索引。

2 .指针信息

通过getPointerCount()方法获取此事件发生时的指针数,该值必须大于或等于1。例如,如果两个手指触摸屏幕,则getPointerCount()为2。

通过getPointerId(int pointerIndex)获取pointerIndex对应的指针id。

通过findPointerIndex(int pointerId)获取pointerId对应的指针索引。

发生此事件时,GetX(int pointerIndex)和getY(int pointerIndex)方法用于获取指针在屏幕上对应于pointerIndex的相对位置。

GetRawX()、getRawY()方法用于在此事件发生时获取指针在屏幕上对应于pointerIndex的绝对位置。没有参数的重载方法意味着获取指针在屏幕上指针索引为0的位置。

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

3.操作时间

您可以通过MotionEvent类的getEventTime()方法获得该事件的时间。

4.事件序列的历史数据

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

以上信息中,前两个用的比较多,就是事件的类型和事件发生时指针的相关信息。

如有任何问题,请留言或与本站社区讨论。感谢阅读,希望能帮到你。感谢您对本站的支持!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • windowsandroid手机版下载,windowsandroid安装apk
  • windowsandroid手机版下载,windowsandroid安装apk,WindowsAndroid 安装教程详解
  • android调用webview方法,androidwebview是什么,Android 中 WebView 的基本用法详解
  • android传感器高级编程,Android传感器,Android编程之光线传感器用法详解
  • android.app.Dialog,android自定义dialog对话框,Android开发笔记之-Dialog的使用详解
  • android 图片视频轮播框架,androidlayout轮播图,Android实现炫酷轮播图效果
  • android里的viewpager,安卓自定义view流程,Android自定义引导玩转ViewPager的方法详解
  • android里的viewpager,android viewpager详解
  • android里的viewpager,android viewpager详解,Android自定义超级炫酷的ViewPage指示器
  • android调用webview方法,androidwebview是什么
  • android设置控件宽度,android获取屏幕宽度和高度
  • android设置控件宽度,android获取屏幕宽度和高度,Android中获取控件宽高的4种方法集合
  • android蓝牙开发的基本流程,安卓蓝牙app开发教程
  • android蓝牙开发的基本流程,安卓蓝牙app开发教程,android蓝牙简单开发示例教程
  • android菜单栏,android菜单控件
  • 留言与评论(共有 条评论)
       
    验证码: