跟踪触摸手势的检测及位置确定

描述

触摸我的触摸屏时会发生什么?

本文将探讨跟踪触摸所涉及的所有内容,从电容感应的物理特性到屏幕上的最终动作。我们描述了如何检测手指以及确定手指位置的方法。我们将手指进一步插入手机的软件堆栈,看看它是如何到达正确的应用程序的。揭开捏和缩放等手势的神秘面纱。

如何检测到触摸?

几乎所有的智能手机触摸屏都会对手指的电容做出反应。触摸屏包含一系列传感器,可检测手指引起的电容变化。当您的手指触摸屏幕时,会影响每个传感器的自电容以及它们之间的互电容。大多数智能手机感应互电容感应而不是自电容。由于互电容是任何给定传感器对之间的相互作用,因此它可用于收集关于屏幕上每个位置的信息(X * Y点)。自电容仅能够检测每个传感器的反应而不是每个点(X + Y样本)。

智能手机

图1:互电容基本原理。

电容式传感器包含多个层:顶层玻璃或塑料,然后是光学透明粘合剂(OCA)层,然后是触摸传感器,然后是LCD。触摸传感器是传感器网格,通常为约5mm×5mm。这些传感器使用氧化铟锡(ITO)制造。 ITO具有一些有趣的特性,使其成为触摸屏构造的理想材料。它的透明度超过90%,但它也具有导电性。一些设计使用菱形图案,这在视觉上令人愉悦,因为它不与LCD图案对齐。其他人则使用更简单的“条纹和条纹”图案。如果以正确的角度检查设备并获得良好的照明,您可以在LCD关闭的情况下看到ITO传感器线。

感应互电容与感应自电容根本不同。为了感测自电容,我们通常测量包含传感器的RC电路的时间常数。感测互电容涉及测量X和Y传感器之间的相互作用。检测在每条X线和每条Y线上驱动的信号以检测传感器之间的耦合水平。有趣的是,手指触摸会减少互电容耦合,同时手指触摸会增加自电容值。

智能手机

图2:互电容感应响应。

在任何一种方法中,仅仅测量电容是不够的。系统必须对电容的变化做出反应,而不是原始电容。为此,系统会为每个传感器维护基线值。该基线值是信号的长期平均值,允许由温度变化和其他因素引起的信号变化。构建触摸屏系统的挑战之一是建立适当的基线。例如,系统必须能够用手指在屏幕上正确启动。系统还必须能够从屏幕上的水或手掌开始。

一旦从感应电容中减去基线值,我们就会得到一个代表触摸的信号值数组,如下图所示:

智能手机

图3:确定手指基于原始电容数据的位置。

使用各种方法根据此信息确定手指位置。最简单的一个是质心(质心)计算,它是一维或二维传感器值的加权平均值。使用1-D质心,上面的X坐标是(5 * 1 + 15 * 2 + 25 * 3 + 10 * 4)/(5 + 15 + 25 + 10)= 150/55 = 2.73。然后我们缩放此位置以匹配LCD分辨率。如果ITO传感器图案延伸超出LCD的侧面,则也会对其进行一些转换。

边缘使手指位置问题复杂化。如果面板在每个列处结束,请考虑上面显示的数组。上面显示的简单质心将开始“拉”到右边,因为左边的术语会下降。为了解决这个问题,我们必须使用特殊的边缘处理技术来检查剩余信号的形状,并估计手指离开屏幕的部分。

与主机处理器的通信

一旦有效的触摸信号出现并且触摸的X/Y坐标已知,就可以将数据送到主机CPU进行处理了。嵌入式触摸屏设备使用古老的I2C接口或SPI进行通信。较大的触摸屏通常使用USB接口,因为Windows,MacOS和Linux都通过USB内置了对HID(人机接口设备)的支持。

虽然采用了几种不同的接口,但OS驱动程序最终会对每种接口进行类似的工作。我们将在我们的示例中讨论Android驱动程序。由于Android和MeeGo都是在Linux上构建的,所以三者都使用类似的驱动程序。

触摸屏驱动程序的中断触发调度工作线程的中断服务程序(ISR)。在ISR中没有做任何工作来维持中断延迟并防止优先级反转。当OS调用工作线程时,它启动通信事务以从设备读取数据并进入休眠状态。通信事务完成后,主机驱动程序将具有继续执行所需的数据。

主机驱动程序将设备制造商使用的专有数据格式转换为标准格式。在Linux中,驱动程序使用一系列子例程调用填充事件的字段,然后通过最终调用发送事件。例如,创建单触式Linux输入事件如下所示:

input_report_abs(ts-》 input,ABS_X,t-》 st_x1);//设置X位置

input_report_abs(ts-》 input,ABS_Y,t-》 st_y1);//设置Y位置

input_report_abs(ts-》 input,ABS_PRESSURE,t-》 st_z1);//设置压力

input_report_key(ts-》 input,BTN_TOUCH,CY_TCH);//按下手指

input_report_abs(ts-》 input,ABS_TOOL_WIDTH,t-》 tool_width);//设置宽度

input_sync(ts-》 input);//发送事件

此触摸事件然后进入操作系统。 Android将事件的历史记录保存在手势处理缓冲区中,并将事件传递给View类。多个触摸屏设备(如赛普拉斯TrueTouch™产品支持硬件手势处理。硬件手势处理减轻了主机操作系统的手势处理负担,并且在许多情况下,它消除了所有触摸数据的处理,直到看到手势。例如,如果你进入你的照片浏览器,主机不必处理数十或数百个触摸数据包就可以看到你想要轻弹到下一张照片。在实际翻到下一张照片之前不会发生中断。

智能手机

图4:简单手势过程的示例。

Android的View类确定触摸发生的哪个应用程序处于活动状态。显示在屏幕上的每个应用程序至少有一个View类。此类包含处理用户输入的方法,包括OnTouchListener,它传递从输入驱动程序接收的信息以及MotionEvent中的其他信息。如果您习惯于编写接受鼠标事件的Windows程序,您可能会对各种鼠标事件和触摸界面之间的差异感到惊讶。 MotionEvent包括您通常期望的类似WM_LBUTTONDOWN的方法,例如GetX和GetY,以及前面的触摸位置和手指在面板上的时间。

一旦应用程序看到事件,应用程序就会对触摸作出反应。这通常由小部件而不是应用程序本身完成。 Android的小部件包括简单的项目,如按钮,复杂的界面,如日期选择器和带取消按钮的进度条。或者,应用程序可以直接使用触摸。绘图应用程序使用两种类型的混合,使用绘图区域中的直接触摸输入和菜单和按钮的小部件。

Windows Touch处理和Android之间的一个区别是手势解释。 Android提供了丰富的手势创建工具库,但不提供任何内置手势。每个设计师都可以自由地创建自己的手势,包括手写等复杂的手势。这种方法已经启用了字符识别联系人搜索等应用程序,但这意味着相同的操作可能无法在两个Android平台上执行相同的操作。 Windows提供了一组固定的易于理解的手势,具有操作系统级别的支持:GID_PAN,GID_ZOOM,GID_ROTATE,GID_PRESSANDTAP和GID_TWOFINGERTAP。这些操作始终会在每个应用程序中执行相同的操作,从而使用户能够快速使用新应用程序。每种方法都有一些优势。

从触摸到手势的路径在技术上具有挑战性,涉及许多部分的相互作用。从材料选择到制造再到电子产品,一切都在触摸感应中起作用。一旦触摸被数字化,它仍然必须被定位,传送给主机并被解释。现在已经满足了这些挑战,软件开发人员可以在其上构建令人兴奋的应用程序。您的下一个应用程序将如何使用这些新的触摸功能?

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分