分享

Android应用程序----界面事件(触摸事件)

 松林园 2021-05-14

Android界面框架支持对触摸事件的监听,并能够将触摸事件的详细信息传递给处理函数 

需要设置触摸事件的监听器,并重载onTouch ()函数


1行代码是设置控件的触摸事件监听器 

在代码第3行的onTouch()函数中,第1个参数View表示产生触摸事件的界面控件;第2个参数MontionEvent表示触摸事件的详细信息,如产生时间、坐标和触点压力等

5行是onTouch()函数的返回值


TouchEventDemo是一个说明如何处理触摸事件的示例 

TouchEventDemo用户界面 

浅蓝色区域是可以接受触摸事件的区域,用户可以在Android模拟器中使用鼠标点击屏幕,用以模拟触摸手机屏幕 

下方黑色区域是显示区域,用来显示触摸事件的类型、相对坐标、绝对坐标、触点压力、触点尺寸和历史数据量等信息

在用户界面中使用了线性布局,并加入了3TextView控件 

1TextViewIDtouch_area)用来标识触摸事件的测试区域 

2TextViewIDhistory_label)用来显示触摸事件的历史数据量 

3TextViewIDevent_label)用来触摸事件的详细信息,包括类型、相对坐标、绝对坐标、触点压力和触点尺寸


XML文件的代码如下

9代码定义了TextView的背景颜色,#80A0FF是颜色代码

10代码定义了TextView的字体颜色


在代码中为了能够引用XML文件中声明的界面元素,使用了下面的代码


当手指接触到触摸屏、在触摸屏上移动或离开触摸屏时,分别会引发ACTION_DOWNACTION_UPACTION_MOVE触摸事件,而无论是哪种触摸事件,都会调用onTouch()函数进行处理 

事件类型包含在onTouch()函数的MotionEvent参数中,可以通过getAction()函数获取到触摸事件的类型,然后根据触摸事件的不同类型进行不同的处理

为了能够使屏幕最上方的TextView处理触摸事件,需要使用setOnTouchListener()函数在代码中设置触摸事件监听器,并在onTouch()函数添加触摸事件的处理过程


7行代码的Display()是一个自定义函数,主要用来显示触摸事件的详细信息,函数的代码和含义将在后面进行介绍 

10行代码的ProcessHistory()也是一个自定义函数,用来处理触摸事件的历史数据,后面进行介绍 

11行代码是使用TextView显示历史数据的数量


MotionEvent参数中不仅有触摸事件的类型信息,还触点的坐标信息,获取方法是使用getX()getY()函数,这两个函数获取到的是触点相对于父界面元素的坐标信息。如果需要获取绝对坐标信息,则可使用getRawX()getRawY()函数 

触点压力是一个介于01之间的浮点数,用来表示用户对触摸屏施加压力的大小,接近0表示压力较小,接近1表示压力较大,获取触摸事件触点压力的方式是调用getPressure()函数 

触点尺寸指用户接触触摸屏的接触点大小,也是一个介于01之间的浮点数,接近0表示尺寸较小,接近1表示尺寸较大,可以使用getSize()函数获取


Display()MotionEvent参数参数中的事件信息提取出来,并显示在用户界面上


一般情况下,如果用户将手指放在触摸屏上,但不移动,然后抬起手指,应先后产生ACTION_DOWNACTION_UP两个触摸事件 

但如果用户在屏幕上移动手指,然后再抬起手指,则会产生这样的事件序列ACTION_DOWN ACTION_MOVE ACTION_MOVE ACTION_MOVE ……ACTION_UP


在手机上运行的应用程序,效率是非常重要的。如果Android界面框架不能产生足够多的触摸事件,则应用程序就不能够很精确的描绘触摸屏上的触摸轨迹 

如果Android界面框架产生了过多的触摸事件,虽然能够满足精度的要求,但却降低了应用程序效率

Android界面框架使用了“打包”的解决方法。在触点移动速度较快时会产生大量的数据,每经过一定的时间间隔便会产生一个ACTION_MOVE事件,在这个事件中,除了有当前触点的相关信息外,还包含这段时间间隔内触点轨迹的历史数据信息,这样既能够保持精度,又不至于产生过多的触摸事件。


通常情况下,在ACTION_MOVE的事件处理函数中,都先处理历史数据,然后再处理当前数据


3行代码获取了历史数据的数量 

然后在第4行至12行中循环处理这些历史数据 

5行代码获取了历史事件的发生时间 

6行代码获取历史事件的触点压力 

7行和第8行代码获取历史事件的相对坐标 

9行获取历史事件的触点尺寸 

在第14行返回历史数据的数量,主要是用于界面显示 

Android模拟器并不支持触点压力和触点尺寸的模拟,所有触点压力恒为1.0,触点尺寸恒为0.0

同时Android模拟器上也无法产生历史数据,因此历史数据量一直显示为0

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多