觸摸我的觸摸屏時會發生什么?
本文將探討跟蹤觸摸所涉及的所有內容,從電容感應的物理特性到屏幕上的最終動作。我們描述了如何檢測手指以及確定手指位置的方法。我們將手指進一步插入手機的軟件堆棧,看看它是如何到達正確的應用程序的。揭開捏和縮放等手勢的神秘面紗。
如何檢測到觸摸?
幾乎所有的智能手機觸摸屏都會對手指的電容做出反應。觸摸屏包含一系列傳感器,可檢測手指引起的電容變化。當您的手指觸摸屏幕時,會影響每個傳感器的自電容以及它們之間的互電容。大多數智能手機感應互電容感應而不是自電容。由于互電容是任何給定傳感器對之間的相互作用,因此它可用于收集關于屏幕上每個位置的信息(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。這些操作始終會在每個應用程序中執行相同的操作,從而使用戶能夠快速使用新應用程序。每種方法都有一些優勢。
從觸摸到手勢的路徑在技術上具有挑戰性,涉及許多部分的相互作用。從材料選擇到制造再到電子產品,一切都在觸摸感應中起作用。一旦觸摸被數字化,它仍然必須被定位,傳送給主機并被解釋?,F在已經滿足了這些挑戰,軟件開發人員可以在其上構建令人興奮的應用程序。您的下一個應用程序將如何使用這些新的觸摸功能?
-
傳感器
+關注
關注
2552文章
51286瀏覽量
755099 -
智能手機
+關注
關注
66文章
18513瀏覽量
180576 -
觸摸
+關注
關注
7文章
199瀏覽量
64343
發布評論請先 登錄
相關推薦
評論