Android input觸摸屏設備

轉自 https://www.kotlintc.com/articles/4709 侵刪

Android支持各種觸摸屏和觸摸板,包括基于觸控筆的數字化板。

觸摸屏是與顯示屏相關聯的觸摸設備,使用戶能夠在屏幕上直接操縱內容。

觸摸板是不與顯示屏相關聯的觸摸設備(如數字化板)。觸摸板通常用于指控或絕對間接定位或基于手勢的界面控制。

觸摸設備可能具有功能與鼠標按鈕類似的按鈕。

有時可以使用各種不同的工具(如手指或觸控筆)操作觸摸設備,具體取決于底層的觸摸傳感器技術。

觸摸設備有時用于實現虛擬按鍵。例如,在某些Android設備上,觸摸屏傳感器區域延伸超出顯示屏的邊緣,作為觸摸式鍵盤的一部分發揮雙重作用。

由于觸摸設備種類繁多,Android依賴于大量配置屬性來描述每個設備的特征和期望的行為。

觸摸設備分類:

如果同時滿足以下兩個條件,則輸入設備屬于多點觸控設備:

輸入設備報告存在ABS_MT_POSITION_X和ABS_MT_POSITION_Y絕對軸。

輸入設備沒有任何游戲手柄按鈕。某些游戲手柄會使用與M 軸的代碼重疊的代碼來報告軸,而這一條件則消除了這種歧義。

如果同時滿足以下兩個條件,則輸入設備屬于單點觸控設備:

輸入設備不屬于多點觸控設備。輸入設備要么屬于單點觸控設備,要么屬于多點觸控設備,而不會同時屬于這兩種類別。

輸入設備報告存在ABS_X和ABS_Y絕對軸以及BTN_TOUCH按鍵代碼。

一旦輸入設備屬于觸摸設備,則通過嘗試加載設備的虛擬按鍵映射文件來確定是否存在虛擬按鍵。如果存在虛擬按鍵映射,則還會加載設備的按鍵布局文件。

有關虛擬按鍵映射文件的位置和格式,請參閱下面的部分。

接下來,系統會加載觸摸設備的輸入設備配置文件。

所有內置觸摸設備都應具有輸入設備配置文件。如果沒有輸入設備配置文件,則系統將選擇適用于典型通用觸摸外設(如外部USB或藍牙HID觸摸屏或觸摸板)的默認配置。這些默認配置不適用于內置觸摸屏,很可能會導致錯誤的行為。

加載輸入設備配置后,系統會將輸入設備分類為觸摸屏、觸摸板或指控設備。

觸摸屏設備用于直接操縱屏幕上的對象。由于用戶直接觸摸屏幕,因此系統不需要任何額外的感知性來指示被操縱的對象。

觸摸板設備用于向應用提供關于在給定傳感器區域上進行觸摸時的絕對定位信息。它可能對數字化板有用。

指控設備用于使用光標間接操縱屏幕上的對象。手指被解釋為多點觸控指控手勢。其他工具(如觸控筆)則通過絕對位置來解釋。

有關詳情,請參閱間接多點觸控指控手勢。

以下規則用于將輸入設備分類為觸摸屏、觸摸板或指控設備。

如果設置了touch.deviceType屬性,則將按照指示設置設備類型。

如果輸入設備報告存在 INPUT_PROP_DIRECT 輸入屬性(通過 EVIOCGPROP ioctl),則設備類型將設置為觸摸屏。該條件假設直接輸入觸摸設備已連接到同樣處于連接狀態的顯示屏。

如果輸入設備報告存在 INPUT_PROP_POINTER 輸入屬性(通過 EVIOCGPROP ioctl),則設備類型將設置為指控設備。

如果輸入設備報告存在REL_X或REL_Y相對軸,則設備類型將設置為觸摸板。該條件消除了由鼠標和觸摸板組成的輸入設備存在的歧義。在這種情況下,觸摸板不會用于控制指針,因為鼠標已經在控制它。

否則,設備類型將被設置為指控設備。該默認設置確保沒有指定任何其他特殊用途的觸摸板將用于控制指針。

按鈕:

按鈕是可供應用用來執行其他功能的“可選”控件。觸摸設備上的按鈕與鼠標按鈕類似,主要與“指針式”觸摸設備或者觸控筆配合使用。

支持以下按鈕:

BTN_LEFT:映射到MotionEvent.BUTTON_PRIMARY。

BTN_RIGHT:映射到MotionEvent.BUTTON_SECONDARY。

BTN_MIDDLE:映射到MotionEvent.BUTTON_MIDDLE。

BTN_BACK和BTN_SIDE:映射到MotionEvent.BUTTON_BACK。按此按鈕還可以合成按鍵(使用按鍵代碼KeyEvent.KEYCODE_BACK)。

BTN_FORWARD和BTN_EXTRA:映射到MotionEvent.BUTTON_FORWARD。按此按鈕還可以合成按鍵(使用按鍵代碼 KeyEvent.KEYCODE_FORWARD)。

BTN_STYLUS:映射到MotionEvent.BUTTON_SECONDARY。

BTN_STYLUS2:映射到MotionEvent.BUTTON_TERTIARY。

工具和工具類型:

“工具”是指用于和觸摸設備進行交互的手指、觸控筆或其他裝置。有些觸摸設備可以區分不同類型的工具。

在Android的其他位置(和在MotionEvent API中一樣),“工具”通常被稱為“指針”。

支持以下工具類型:

BTN_TOOL_FINGER和MT_TOOL_FINGER:映射到MotionEvent.TOOL_TYPE_FINGER。

BTN_TOOL_PEN和MT_TOOL_PEN:映射到MotionEvent.TOOL_TYPE_STYLUS。

BTN_TOOL_RUBBER:映射到MotionEvent.TOOL_TYPE_ERASER。

BTN_TOOL_BRUSH:映射到MotionEvent.TOOL_TYPE_STYLUS。

BTN_TOOL_PENCIL:映射到MotionEvent.TOOL_TYPE_STYLUS。

BTN_TOOL_AIRBRUSH:映射到MotionEvent.TOOL_TYPE_STYLUS。

BTN_TOOL_MOUSE:映射到MotionEvent.TOOL_TYPE_MOUSE。

BTN_TOOL_LENS:映射到MotionEvent.TOOL_TYPE_MOUSE。

BTN_TOOL_DOUBLETAP、BTN_TOOL_TRIPLETAP 和 BTN_TOOL_QUADTAP:映射到MotionEvent.TOOL_TYPE_FINGER。

懸停與觸摸工具:

工具可以與觸摸設備接觸,也可以在觸摸設備的感應范圍內懸停在設備的上方。并非所有觸摸設備都能夠感應到懸停在其上方的工具。那些可實現感應的觸摸設備(如基于射頻的觸控筆數字化儀)通常能在工具進入其有限的感應范圍后檢測到該工具。

InputReader 組件會謹慎區分觸摸工具和懸停工具。同樣,觸摸工具和懸停工具也會以不同的方式報告給應用。

觸摸工具將通過以下組件作為觸摸事件報告給應用:MotionEvent.ACTION_DOWN、MotionEvent.ACTION_MOVE、MotionEvent.ACTION_DOWN、MotionEvent.ACTION_POINTER_DOWN 和 MotionEvent.ACTION_POINTER_UP。

懸停工具將通過以下組件作為通用動作事件報告給應用:MotionEvent.ACTION_HOVER_ENTER、MotionEvent.ACTION_HOVER_MOVE和MotionEvent.ACTION_HOVER_EXIT。

觸摸設備驅動程序要求:

觸摸設備驅動程序應該僅注冊它們實際支持的軸/按鈕的軸/按鍵代碼。如果注冊多余的軸/按鍵代碼,則可能會混淆設備分類算法或導致系統錯誤地檢測設備的功能。

例如,如果設備報告BTN_TOUCH按鍵代碼,系統會假設BTN_TOUCH將始終用于指示該工具是實際觸摸屏幕還是只在感應范圍內懸停。

單點觸控設備使用以下Linux輸入事件:

ABS_X:(必需)報告工具的X坐標。

ABS_Y:(必需)報告工具的Y坐標。

ABS_PRESSURE:(可選)報告應用于工具尖端的物理壓力或觸摸點的信號強度。

ABS_TOOL_WIDTH:(可選)報告觸摸點或工具本身的橫截面積或寬度。

ABS_DISTANCE:(可選)報告工具與觸摸設備表面之間的距離。

ABS_TILT_X:(可選)報告工具沿觸摸設備表面X軸方向的傾斜度。

ABS_TILT_Y:(可選)報告工具沿觸摸設備表面Y軸方向的傾斜度。

BTN_TOUCH:(必需)指示工具是否觸摸到設備。

BTN_LEFT、BTN_RIGHT、BTN_MIDDLE、BTN_BACK、BTN_SIDE、BTN_FORWARD、BTN_EXTRA、BTN_STYLUS、BTN_STYLUS2:(可選)報告按鈕狀態。

BTN_TOOL_FINGER、BTN_TOOL_PEN、BTN_TOOL_RUBBER、BTN_TOOL_BRUSH、BTN_TOOL_PENCIL、BTN_TOOL_AIRBRUSH、BTN_TOOL_MOUSE、BTN_TOOL_LENS、BTN_TOOL_DOUBLETAP、BTN_TOOL_TRIPLETAP、BTN_TOOL_QUADTAP:(可選)報告工具類型。

多點觸控設備使用以下Linux輸入事件:

ABS_MT_POSITION_X:必需,報告工具的X坐標。

ABS_MT_POSITION_Y:必需,報告工具的Y坐標。

ABS_MT_PRESSURE:可選,報告應用于工具尖端的物理壓力或觸摸點的信號強度。

ABS_MT_TOUCH_MAJOR:可選,報告觸摸點的橫截面積或觸摸點間較長尺寸的長度。

ABS_MT_TOUCH_MINOR:可選,報告觸摸點間較短尺寸的長度。如果ABS_MT_TOUCH_MAJOR報告區域測量,則不應使用此軸。

ABS_MT_WIDTH_MAJOR:可選,報告工具本身的橫截面積或工具本身較長尺寸的長度。如果工具本身的尺寸未知,則不應使用此軸。

ABS_MT_WIDTH_MINOR:可選,報告工具本身較短尺寸的長度。如果ABS_MT_WIDTH_MAJOR報告區域測量或者工具本身的尺寸未知,則不應使用此軸。

ABS_MT_ORIENTATION:可選,報告工具的方向。

ABS_MT_DISTANCE:可選,報告工具與觸摸設備表面之間的距離。

ABS_MT_TOOL_TYPE:可選,將工具類型報告為MT_TOOL_FINGER或MT_TOOL_PEN。

ABS_MT_TRACKING_ID:可選,報告工具的跟蹤ID。跟蹤ID是一個任意的非負整數。當多個工具同時處于活動狀態時,該ID用于獨立地識別和跟蹤各個工具。例如,當多個手指同時觸摸設備時,會為每個手指分配一個不同的跟蹤ID,用于在手指保持接觸期間識別手指。跟蹤ID可在其關聯的工具移出感應范圍后重復使用。

ABS_MT_SLOT:可選,在使用Linux多點觸控協議“B”時,報告工具的槽位ID。有關詳情,請參閱Linux多點觸控協議文檔。

BTN_TOUCH:必需,指示工具是否觸摸到設備。

BTN_LEFT、BTN_RIGHT、BTN_MIDDLE、BTN_BACK、BTN_SIDE、BTN_FORWARD、BTN_EXTRA、BTN_STYLUS、BTN_STYLUS2:可選,報告按鈕狀態。

BTN_TOOL_FINGER、BTN_TOOL_PEN、BTN_TOOL_RUBBER、BTN_TOOL_BRUSH、BTN_TOOL_PENCIL、BTN_TOOL_AIRBRUSH、BTN_TOOL_MOUSE、BTN_TOOL_LENS、BTN_TOOL_DOUBLETAP、BTN_TOOL_TRIPLETAP、BTN_TOOL_QUADTAP:可選,報告工具類型。

如果同時定義了單點觸控協議軸和多點觸控協議軸,則僅使用多點觸控軸,并忽略單點觸控軸。

ABS_X、ABS_Y、ABS_MT_POSITION_X和ABS_MT_POSITION_Y 軸的最小值和最大值用于在特定于設備的Surface單元內指定設備有效區域的范圍。如果是觸摸屏,有效區域是指觸摸設備實際覆蓋顯示屏的部分。

對于觸摸屏,系統會自動插入報告的觸摸位置(在Surface單元內),以通過以下公式計算得出采用顯示像素表示的觸摸位置:

displayX = (x - minX) * displayWidth / (maxX - minX + 1)

displayY = (y - minY) * displayHeight / (maxY - minY + 1)

觸摸屏可能會報告在報告的有效區域之外發起的觸摸。

在有效區域之外發起的觸摸不會傳遞給應用,但可用于虛擬按鍵。

在有效區域內發起的觸摸或進入和退出顯示區域的觸摸會傳遞給應用。因此,如果觸摸是在應用的范圍內開始,然后移動到有效區域之外,則應用可能會收到顯示坐標為負或超出顯示范圍的觸摸事件。這屬于正?,F象。

觸摸設備不得限制有效區域的觸摸坐標邊界。如果觸摸退出有效區域,則應將其報告為超出有效區域范圍,或者根本不應報告。

例如,如果用戶的手指在觸摸屏左上角附近觸摸,則可能會報告(minX, minY)坐標。如果手指繼續移動到有效區域之外,觸摸屏應該開始報告分量小于minX和min 的坐標(如(minX - 2, minY - 3)),或者完全停止報告觸摸。換句話說,當用戶的手指確實觸摸到有效區域之外時,觸摸屏不應該報告(minX, minY)。

如果將觸摸坐標限制到顯示屏邊緣,則會在屏幕邊緣周圍產生人為硬邊界,阻止系統順暢地跟蹤進入或退出顯示區域邊界的運動。

ABS_PRESSURE或ABS_MT_PRESSURE報告的值(如果有報告)在工具觸摸設備時必須為非零值;否則就為零,表示該工具處于懸停狀態。

報告壓力信息為可選項,但強烈建議報告該信息。應用可以使用壓力信息來實現壓敏繪圖等效果。

ABS_TOOL_WIDTH、ABS_MT_TOUCH_MAJOR、ABS_MT_TOUCH_MINOR、ABS_MT_WIDTH_MAJOR或ABS_MT_WIDTH_MINOR報告的值在工具觸摸設備時應為非零值;否則就為零,但這不是必需的。例如,觸摸設備可能能夠測量手指觸摸點的尺寸,但不能測量觸控筆觸摸點的尺寸。

報告大小信息為可選項,但強烈建議報告。應用可以使用壓力信息來實現尺寸敏感繪圖等效果。

ABS_DISTANCE或ABS_MT_DISTANCE報告的值在工具觸摸設備時應接近零。即使當工具處于直接接觸時,距離仍可能為非零。報告的確切值取決于硬件測量距離的方式。

報告距離信息為可選項,但建議用于觸控筆設備。

當工具垂直于設備時,ABS_TILT_X和ABS_TILT_Y報告的值應為零。將非零傾斜作為工具保持在傾斜處的標志。

假定沿X軸和Y軸的傾斜角度以與垂直方向的夾角計。中心點(完全垂直)由每個軸的(max + min) / 2指定。小于中心點的值表示向上或向左傾斜,大于中心點的值表示向下或向右傾斜。

InputReader將X和Y傾斜分量轉換成從0到PI / 2弧度的垂直傾斜角以及從-PI到PI弧度的平面定向角。該表示法將產生與描述手指觸摸所用方向相符的方向的描述。

報告傾斜信息為可選項,但建議用于觸控筆設備。

如果工具類型是由ABS_MT_TOOL_TYPE報告的,則會取代BTN_TOOL_*報告的任何工具類型信息。如果根本沒有可用的工具類型信息,則工具類型將默認為MotionEvent.TOOL_TYPE_FINGER。

根據以下條件確定工具的活動狀態:

當使用單點觸控協議時,如果BTN_TOUCH或BTN_TOOL_*為1,則表示工具處于活動狀態。

這個條件意味著InputReader至少需要獲得一些關于工具性質的信息:工具是否正在觸摸,或者至少知道工具的類型。如果沒有可用的信息,則假定工具處于非活動狀態(超出范圍)。

當使用多點觸控協議“A”時,只要工具出現在最近的同步報告中,則表示其處于活動狀態。當工具不再出現在同步報告中時,則表示工具不再存在。

當使用多點觸控協議“B”時,只要工具具有活動插槽,則表示其處于活動狀態。當插槽被清除時,則表示工具不再存在。

根據以下條件確定工具懸停:

如果工具為BTN_TOOL_MOUSE或BTN_TOOL_LENS,則該工具不會懸停,即使以下任一條件為真也不例外。

如果工具處于活動狀態,并且驅動程序報告的壓力為零,則表示工具處于懸停狀態。

如果工具處于活動狀態,而且驅動程序支持BTN_TOUCH按鍵代碼,并且BTN_TOUCH的值為零,則表示工具處于懸停狀態。

InputReader支持多點觸控協議“A”和“B”。新驅動程序應該使用“B”協議,但是使用任一協議均可正常運作。

根據Android Ice Cream Sandwich 4.0,可能需要更改觸摸屏驅動程序,以符合Linux 輸入協議規范。

可能需要進行以下更改:

當一個工具變為非活動狀態(“抬起”一根手指)時,它應該停止顯示在后續的多點觸控同步報告中。當所有工具變為非活動狀態(“抬起”所有手指)時,驅動程序應發送一個空的同步報告數據包,如SYN_MT_REPORT后跟SYN_REPORT。

以前版本的Android通過發送壓力值0來報告“抬起”事件。該舊行為與Linux輸入協議規范不兼容,因此不再受支持。

物理壓力或信號強度信息應使用ABS_MT_PRESSURE進行報告。

以前版本的Android從ABS_MT_TOUCH_MAJOR檢索壓力信息。該舊行為與Linux輸入協議規范不兼容,因此不再受支持。

觸摸尺寸信息應使用ABS_MT_TOUCH_MAJOR進行報告。

以前版本的Android從ABS_MT_TOOL_MAJOR檢索尺寸信息。該舊行為與Linux輸入協議規范不兼容,因此不再受支持。

觸摸設備驅動程序不再需要Android系統專用的自定義設置。通過依靠標準的Linux輸入協議,Android可以使用未經修改的驅動程序來支持更多種類的觸摸外設,如外部HID多點觸控觸摸屏。

觸摸設備操作:

下面簡要匯總了Android上的觸摸設備操作。

EventHub從evdev驅動程序讀取原始事件。

InputReader消耗原始事件,并更新關于每個工具的位置和其他特征的內部狀態。它還會跟蹤按鈕狀態。

如果按下或釋放“后退”或“前進”按鈕,InputReader會向InputDispatcher發出按鍵事件通知。

InputReader確定是否發生了虛擬按鍵的按壓操作。如果是,它會向InputDispatcher發出按鍵事件通知。

InputReader確定觸摸行為是否在顯示范圍內發起的。如果是,它會向InputDispatcher發出觸摸事件通知。

如果沒有觸摸工具,但至少有一個懸停工具,則InputReader會向InputDispatcher發出懸停事件通知。

如果觸摸設備類型是指控設備,則InputReader會執行指針手勢檢測,相應地移動指針和相關點,并向InputDispatcher發出指針事件通知。

InputDispatcher使用WindowManagerPolicy來確定是否應該調度這些事件,以及它們是否應該喚醒設備。然后,InputDispatcher將事件傳遞給相應的應用。

觸摸設備配置:

觸摸設備行為由設備的坐標軸、按鈕、輸入屬性、輸入設備配置、虛擬按鍵映射和按鍵布局確定。

要詳細了解參與鍵盤配置的文件,請參閱以下部分:

輸入設備配置文件;

虛擬按鍵映射文件;

屬性:

系統依賴于許多輸入設備配置屬性來配置和校準觸摸設備行為。

原因之一是觸摸設備的設備驅動程序通常使用特定于設備的單元來報告觸摸特性。

例如,許多觸摸設備使用內部特定于設備的比例(例如由觸摸觸發的傳感器節點的總數)來測量觸摸接觸面積。此原始尺寸值對應用來說沒有意義,因為它們需要了解觸摸設備傳感器節點的物理尺寸和其他特性。

系統使用在輸入設備配置文件中編碼的校準參數,將觸摸設備報告的值解碼、轉換和標準化為應用可以理解的更簡單的標準表示。

文檔規范:對本文檔而言,我們將使用以下規范來描述系統在校準過程中使用的值。

原始軸值:以下表達式表示觸摸設備驅動程序作為EV_ABS事件報告的原始值。

raw.x

ABS_X或ABS_MT_POSITION_X軸的值。

raw.y

ABS_Y或ABS_MT_POSITION_Y軸的值。

raw.pressure

ABS_PRESSURE或ABS_MT_PRESSURE軸的值,如果未提供,則為0。

raw.touchMajor

ABS_MT_TOUCH_MAJOR軸的值,如果未提供,則為0。

raw.touchMinor

ABS_MT_TOUCH_MINOR軸的值,如果未提供,則為raw.touchMajor。

raw.toolMajor

ABS_TOOL_WIDTH或ABS_MT_WIDTH_MAJOR軸的值,如果未提供,則為0。

raw.toolMinor

ABS_MT_WIDTH_MINOR軸的值,如果未提供,則為raw.toolMajor。

raw.orientation

ABS_MT_ORIENTATION軸的值,如果未提供,則為0。

raw.distance

ABS_DISTANCE或ABS_MT_DISTANCE軸的值,如果未提供,則為0。

raw.tiltX

ABS_TILT_X軸的值,如果未提供,則為0。

raw.tiltY

ABS_TILT_Y軸的值,如果未提供,則為0。

原始軸范圍

以下表達式表示原始值的范圍。通過為每個軸調用EVIOCGABS ioctl獲得它們。

raw.*.min

原始軸的最小值(含)。

raw.*.max

原始軸的最大值(含)。

raw.*.range

相當于 raw..max - raw..min。

raw.*.fuzz

原始軸的精度。例如,fuzz = 1 表示值精確到 +/- 1 個單位。

raw.width

觸摸區域的寬度(含),相當于 raw.x.range + 1。

raw.height

觸摸區域的高度(含),相當于 raw.y.range + 1。

輸出范圍

以下表達式表示輸出坐標系的特性。系統使用線性插值將觸摸設備使用的 Surface 單元的觸摸位置信息轉換成將報告給應用的輸出單元(如顯示像素)。

output.width

輸出寬度。對于觸摸屏(與顯示屏相關聯),輸出寬度是顯示屏寬度(以像素為單位)。對于觸摸板(不與顯示屏相關聯),輸出寬度等于raw.width,表示不會插入值。

output.height

輸出高度。對于觸摸屏(與顯示屏相關聯),輸出高度是顯示屏高度(以像素為單位)。對于觸摸板(不與顯示屏相關聯),輸出高度等于raw.height,表示不會插入值。

output.diag

輸出坐標系的對角線長度,相當于 sqrt(output.width ^2 + output.height ^2)。

基礎配置:

觸摸輸入映射器在輸入設備配置文件中使用許多配置屬性來指定校準值。下表介紹了一些通用配置屬性。在下面的部分中介紹了所有其他屬性及其進行校準所用的字段。

touch.deviceType

定義:touch.deviceType = touchScreen | touchPad | pointer | default

指定觸摸設備類型。

如果值為touchScreen,則觸摸設備是與顯示屏相關聯的觸摸屏。

如果值為touchPad,則觸摸設備是不與顯示屏相關聯的觸摸板。

如果值為pointer,則觸摸設備是不與顯示屏相關聯的觸摸板,并且其動作用于間接多點觸控指控手勢。

如果值為default,則系統將根據分類算法自動檢測設備類型。

有關設備類型如何影響觸摸設備的行為的詳細信息,請參閱分類部分。

在Honeycomb之前,所有觸摸設備都被視為觸摸屏。

touch.orientationAware

定義:touch.orientationAware = 0 | 1

指定觸摸設備是否應對顯示屏的方向更改做出響應。

如果值為1,則只要顯示屏的方向更改了,觸摸設備報告的觸摸位置就會旋轉。

如果值為0,則觸摸設備報告的觸摸位置將不受顯示屏方向更改的影響。

如果設備是觸摸屏,則默認值為1,否則為0。

系統會區分內部和外部觸摸屏與顯示部分。方向感知型內部觸摸屏基于內部顯示部分的方向進行旋轉。方向感知型外部觸摸屏基于外部顯示部分的方向進行旋轉。

方向感知功能用于支持Nexus One等設備上的觸摸屏旋轉。例如,當設備從其自然方向順時針旋轉90度時,觸摸的絕對位置將被重新映射,使得在觸摸屏絕對坐標系左上角的觸摸行為被報告為在顯示屏旋轉坐標系左上角的觸摸行為。這樣做是為了使用應用繪制其可見元素時所用的同一坐標系報告觸摸行為。

在Honeycomb之前,所有觸摸設備都被視為具有方向感知功能。

touch.gestureMode

定義:touch.gestureMode = pointer | spots | default

指定指控手勢的表示模式。僅在觸摸設備為指控類型時,該配置屬性才具有相關性。

如果值為pointer,則觸摸板手勢將通過與鼠標指針相似的光標來表示。

如果值為spots,則觸摸板手勢由代表手勢形心的錨點和代表各個手指位置的一組圓形斑點來表示。

如果設置了INPUT_PROP_SEMI_MT輸入屬性,則默認值為pointer,否則為spots。

X和Y字段

X和Y字段給出了接觸區域中心的位置信息。

計算:

計算非常簡單:來自觸摸驅動程序的位置信息被線性插入輸出坐標系。

xScale = output.width / raw.width

yScale = output.height / raw.height

If not orientation aware or screen rotation is 0 degrees:

output.x = (raw.x - raw.x.min) * xScale

output.y = (raw.y - raw.y.min) * yScale

Else If rotation is 90 degrees:

output.x = (raw.y - raw.y.min) * yScale

output.y = (raw.x.max - raw.x) * xScale

Else If rotation is 180 degrees:

output.x = (raw.x.max - raw.x) * xScale

output.y = (raw.y.max - raw.y) * yScale

Else If rotation is 270 degrees:

output.x = (raw.y.max - raw.y) * yScale

output.y = (raw.x - raw.x.min) * xScale

End If

TouchMajor、TouchMinor、ToolMajor、ToolMinor、Size字段

TouchMajor和TouchMinor字段描述了在輸出單元中接觸區域的大致維度(單位為像素)。

ToolMajor和ToolMinor字段描述了在輸出單元中工具本身的大致維度(單位為像素)。

Size字段描述了相對于觸摸設備可以感知的最大可能觸摸區域的標準化觸摸區域尺寸??赡艿淖钚藴驶叽鐬?0.0(無接觸或不可測量),可能的最大標準化尺寸為 1.0(傳感器區域已經完全覆蓋)。

如果可以同時測量近似長度和寬度,則 TouchMajor 字段會指定接觸區域的較長維度,TouchMinor 字段會指定接觸區域的較短維度。如果只能測量接觸區域的大致直徑,則 TouchMajor 和 TouchMinor 字段將相等。

同樣,ToolMajor 字段會指定工具截斷面的較長維度,ToolMinor 字段會指定工具截斷面的較短維度。

如果觸摸尺寸不可測量,但工具尺寸可測量,則工具尺寸將設為等于觸摸尺寸。相反,如果工具尺寸不可測量,但觸摸尺寸可測量,則觸摸尺寸將設為等于工具尺寸。

觸摸設備以各種方式測量或報告觸摸尺寸和工具尺寸。目前的實現支持三種不同的測量方式:Surface 單元內的直徑、面積和幾何邊界區域。

touch.size.calibration

定義:touch.size.calibration = none | geometric | diameter | area | default

指定觸摸驅動程序報告觸摸尺寸和工具尺寸時所用的測量類型。

如果值為none,則尺寸設為零。

如果值為geometric,則假定以與位置相同的Surface單元指定尺寸,從而以相同的方式對尺寸進行縮放。

如果值為diameter,則假定尺寸與觸摸或工具直徑(寬度)成比例。

如果值為area,則假定尺寸與觸摸或工具面積成比例。

如果值為default,那么在raw.touchMajor或raw.toolMajor軸提供值的情況下,系統將使用geometric校準,否則將使用none校準。

touch.size.scale

定義:touch.size.scale = <非負浮點數>

指定校準中使用的恒定比例因子。

默認值為1.0。

touch.size.bias

定義:touch.size.bias = <非負浮點數>

指定校準中使用的恒定偏差值。

默認值為0.0。

touch.size.isSummed

定義:touch.size.isSummed = 0 | 1

指定尺寸是報告為所有有效接觸區域的尺寸總和,還是針對每個接觸區域單獨報告尺寸。

如果值為1,則報告的尺寸需除以接觸數量,然后才能使用。

如果值為0,則報告的尺寸將按原樣使用。

默認值為0。

一些觸摸設備(尤其是“Semi-MT”設備)無法區分多個接觸點的單個維度,因此它們會報告表示其總面積或寬度的尺寸測量結果。對于此類設備,此屬性只能設為 1。如果有疑問,請將此值設為 0。

計算

TouchMajor、TouchMinor、ToolMajor、ToolMinor 和 Size 字段的計算方法取決于指定的校準參數。

If raw.touchMajor and raw.toolMajor are available:

touchMajor = raw.touchMajor

touchMinor = raw.touchMinor

toolMajor = raw.toolMajor

toolMinor = raw.toolMinor

Else If raw.touchMajor is available:

toolMajor = touchMajor = raw.touchMajor

toolMinor = touchMinor = raw.touchMinor

Else If raw.toolMajor is available:

touchMajor = toolMajor = raw.toolMajor

touchMinor = toolMinor = raw.toolMinor

Else

touchMajor = toolMajor = 0

touchMinor = toolMinor = 0

size = 0

End If

size = avg(touchMajor, touchMinor)

If touch.size.isSummed == 1:

touchMajor = touchMajor / numberOfActiveContacts

touchMinor = touchMinor / numberOfActiveContacts

toolMajor = toolMajor / numberOfActiveContacts

toolMinor = toolMinor / numberOfActiveContacts

size = size / numberOfActiveContacts

End If

If touch.size.calibration == "none":

touchMajor = toolMajor = 0

touchMinor = toolMinor = 0

size = 0

Else If touch.size.calibration == "geometric":

outputScale = average(output.width / raw.width, output.height / raw.height)

touchMajor = touchMajor * outputScale

touchMinor = touchMinor * outputScale

toolMajor = toolMajor * outputScale

toolMinor = toolMinor * outputScale

Else If touch.size.calibration == "area":

touchMajor = sqrt(touchMajor)

touchMinor = touchMajor

toolMajor = sqrt(toolMajor)

toolMinor = toolMajor

Else If touch.size.calibration == "diameter":

touchMinor = touchMajor

toolMinor = toolMajor

End If

If touchMajor != 0:

output.touchMajor = touchMajor * touch.size.scale + touch.size.bias

Else

output.touchMajor = 0

End If

If touchMinor != 0:

output.touchMinor = touchMinor * touch.size.scale + touch.size.bias

Else

output.touchMinor = 0

End If

If toolMajor != 0:

output.toolMajor = toolMajor * touch.size.scale + touch.size.bias

Else

output.toolMajor = 0

End If

If toolMinor != 0:

output.toolMinor = toolMinor * touch.size.scale + touch.size.bias

Else

output.toolMinor = 0

End If

output.size = size

Pressure字段

Pressure字段描述了以介于0.0(無接觸)和1.0(全力)之間的標準化值形式施加到觸摸設備的近似物理壓力。

零壓力表示工具處于懸停狀態。

touch.pressure.calibration

定義:touch.pressure.calibration = none | physical | amplitude | default

指定觸摸驅動程序報告壓力所用的測量類型。

如果值為none,壓力未知,因此觸摸時設置為 1.0,懸停時為 0.0。

如果值為physical,則認為壓力軸測量的是施加到觸摸板的壓力的實際物理強度。

如果值為amplitude,則認為壓力軸測量的是信號幅度(與接觸的尺寸和施加的壓力有關)。

如果值為default,在壓力軸可用的情況下,系統將使用physical校準,否則使用none。

touch.pressure.scale

定義:touch.pressure.scale = <非負浮點數>

指定校準中使用的恒定比例因子。

默認值為1.0 / raw.pressure.max。

計算

Pressure字段的計算方法取決于指定的校準參數。

If touch.pressure.calibration == "physical" or "amplitude":

output.pressure = raw.pressure * touch.pressure.scale

Else

If hovering:

    output.pressure = 0

Else

    output.pressure = 1

End If

End If

Orientation 和 Tilt 字段

Orientation字段以角度測量的形式描述了觸摸和工具的方向。值0表示長軸垂直取向,-PI/2表示長軸朝向左側,PI/2表示長軸朝向右側。當存在觸控筆工具時,方向范圍可以是從-PI到PI的整個圓環范圍。

Tilt字段通過測量角度描述了工具的傾斜度。傾斜度為0表示工具垂直于表面。傾斜度為PI/2表示工具與表面平行。

touch.orientation.calibration

定義:touch.orientation.calibration = none | interpolated | vector | default

指定觸摸驅動程序報告方向時所用的測量類型。

如果值為none,則方向未知,因此設為0。

如果值為interpolated,則方向被線性插入,使得raw.orientation.min的原始值映射到-PI/2,raw.orientation.max的原始值映射到PI/2。(raw.orientation.min + raw.orientation.max) / 2的中心值映射到0。

如果值為vector,則方向表示為包含兩個帶符號的4位字段的壓縮向量。該表示用于Atmel基于對象的協議部分。當解碼時,向量生成定向角和置信度。置信度用于縮放尺寸信息,除非它是幾何圖形。

如果值為default,那么在方向軸可用的情況下,系統將使用interpolated校準,否則使用none。

計算

Orientation和Tilt字段的計算方法取決于指定的校準參數和可用輸入。

If touch.tiltX and touch.tiltY are available:

tiltXCenter = average(raw.tiltX.min, raw.tiltX.max)

tiltYCenter = average(raw.tiltY.min, raw.tiltY.max)

tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180

tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180

output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle))

output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle))

Else If touch.orientation.calibration == "interpolated":

center = average(raw.orientation.min, raw.orientation.max)

output.orientation = PI / (raw.orientation.max - raw.orientation.min)

output.tilt = 0

Else If touch.orientation.calibration == "vector":

c1 = (raw.orientation & 0xF0) >> 4

c2 = raw.orientation & 0x0F



If c1 != 0 or c2 != 0:

    If c1 >= 8 Then c1 = c1 - 16

    If c2 >= 8 Then c2 = c2 - 16

    angle = atan2(c1, c2) / 2

    confidence = sqrt(c1*c1 + c2*c2)



    output.orientation = angle



    If touch.size.calibration == "diameter" or "area":

        scale = 1.0 + confidence / 16

        output.touchMajor *= scale

        output.touchMinor /= scale

        output.toolMajor *= scale

        output.toolMinor /= scale

    End If

Else

    output.orientation = 0

End If

output.tilt = 0

Else

output.orientation = 0

output.tilt = 0

End If

If orientation aware:

If screen rotation is 90 degrees:

    output.orientation = output.orientation - PI / 2

Else If screen rotation is 270 degrees:

    output.orientation = output.orientation + PI / 2

End If

End If

Distance字段

Distance字段描述了工具和觸摸設備表面之間的距離。值0.0表示直接接觸,值越大,表示與表面之間的距離越遠。

touch.distance.calibration

定義:touch.distance.calibration = none | scaled | default

指定觸摸驅動程序報告距離時所用的測量類型。

如果值為none,則距離未知,因此設為 0。

如果值為scaled,則報告的距離將乘以恒定比例因子。

如果值為default,則在距離軸可用的情況下,系統將使用 scaled 校準,否則使用 none。

touch.distance.scale

定義:touch.distance.scale = <非負浮點數>

指定校準中使用的恒定比例因子。

默認值為 1.0。

計算

Distance 字段的計算方法取決于指定的校準參數。

If touch.distance.calibration == "scaled":

output.distance = raw.distance * touch.distance.scale

Else

output.distance = 0

End If

示例

Input device configuration file for a touch screen that supports pressure,

size and orientation. The pressure and size scale factors were obtained

by measuring the characteristics of the device itself and deriving

useful approximations based on the resolution of the touch sensor and the

display.

Note that these parameters are specific to a particular device model.

Different parameters will need to be used for other devices.

Basic Parameters

touch.deviceType = touchScreen

touch.orientationAware = 1

Size

Based on empirical measurements, we estimate the size of the contact

using size = sqrt(area) * 28 + 0.

touch.size.calibration = area

touch.size.scale = 28

touch.size.bias = 0

touch.size.isSummed = 0

Pressure

Driver reports signal strength as pressure.

A normal index finger touch typically registers about 80 signal strength

units although we don't expect these values to be accurate.

touch.pressure.calibration = amplitude

touch.pressure.scale = 0.0125

Orientation

touch.orientation.calibration = vector

兼容性說明

觸摸設備的配置屬性在 Android Ice Cream Sandwich 4.0 中發生了重大變化。必須更新觸摸設備的所有輸入設備配置文件,才能使用新配置屬性。

更舊的觸摸設備驅動程序可能也需要更新。

虛擬按鍵映射文件:

觸摸設備經常用于實現虛擬按鍵。

有幾種方法可以做到這一點,具體取決于觸摸控制器的功能。一些觸摸控制器可以直接配置為通過設置固件寄存器來實現軟鍵。其他時候,最好在軟件中執行從觸摸坐標到按鍵代碼的映射。

在軟件中實現虛擬按鍵時,內核必須將名為virtualkeys.<devicename>的虛擬按鍵映射文件作為本機已加載屬性導出。例如,如果觸摸屏設備驅動程序將其名稱報告為“touchyfeely”,則虛擬按鍵映射文件的路徑必須為 /sys/board_properties/virtualkeys.touchyfeely。

虛擬按鍵映射文件描述了觸摸屏上虛擬按鍵的坐標和Linux按鍵代碼。

除了虛擬按鍵映射文件外,還必須有一個對應的按鍵布局文件和按鍵字符映射文件,以將Linux按鍵代碼映射到Android按鍵代碼,并指定鍵盤設備的類型(通常為SPECIAL_FUNCTION)。

語法:

虛擬按鍵映射文件是一個純文本文件,由一系列用換行符或冒號分隔的虛擬按鍵布局描述組成。

注釋行以“#”開頭,并持續到這一行的結束位置。

每個虛擬按鍵用由6個冒號分隔的組件進行描述:

0x01:版本代碼。必須始終為0x01。

<Linux key code>:虛擬按鍵的Linux按鍵代碼。

<centerX>:虛擬按鍵中心的X軸坐標,以像素為單位。

<centerY>:虛擬按鍵中心的Y軸坐標,以像素為單位。

<width>:虛擬按鍵的寬度,以像素為單位。

<height>:虛擬按鍵的高度,以像素為單位。

所有的坐標和尺寸都是根據顯示坐標系指定的。

下面是一個虛擬按鍵映射文件,全部寫在一行上。

All on one line

0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55

相同的虛擬按鍵映射文件也可以寫在多行上。

One key per line

0x01:158:55:835:90:55

0x01:139:172:835:125:55

0x01:102:298:835:115:55

0x01:217:412:835:95:55

在上述示例中,觸摸屏具有480×800的分辨率。因此,所有虛擬按鍵的<centerY>坐標為835,位于略低于觸摸屏可見區域的位置。

第一個按鍵的Linux掃描代碼為158 (KEY_BACK),centerX為55,centerY為835,width為90,height為55。

示例

虛擬按鍵映射文件:/sys/board_properties/virtualkeys.touchyfeely。

0x01:158:55:835:90:55

0x01:139:172:835:125:55

0x01:102:298:835:115:55

0x01:217:412:835:95:55

按鍵布局文件:/system/usr/keylayout/touchyfeely.kl。

key 158 BACK

key 139 MENU

key 102 HOME

key 217 SEARCH

按鍵字符映射文件:/system/usr/keychars/touchyfeely.kcm。

type SPECIAL_FUNCTION

間接多點觸控指控手勢

在指控模式下,系統會解釋以下手勢:

單指點按:點擊。

單指移動:移動指針。

單指移動加按下按鈕:拖動指針。

兩個手指移動(兩個手指沿相同的方向移動):沿著該方向拖動指針下方的區域。指針本身不動。

兩個手指移動(兩個手指朝著彼此移動或者移向不同方向):平移/縮放/旋轉指針周圍的區域。指針本身不動。

多個手指移動:自由手勢。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容

  • 一、觸摸屏概述 觸摸屏作為一種輸入設備,是目前最簡單、方便、自然的一種人機交互方式。按照觸摸屏的工作原理和...
    JalynFang閱讀 3,345評論 0 4
  • 寫在前面 主機:Android 5.0+ 內核3.4從機:SensorTile先上一個效果圖 原理解析 HID事件...
    施瓦辛格777閱讀 5,387評論 1 3
  • 跨進程模擬觸屏事件的作用## 有很多在一個Activity中實現虛擬觸摸的方法,但是無法做到跨進程虛擬觸摸。無論是...
    babybus_hentai閱讀 8,494評論 1 3
  • 專業考題類型管理運行工作負責人一般作業考題內容選項A選項B選項C選項D選項E選項F正確答案 變電單選GYSZ本規程...
    小白兔去釣魚閱讀 9,036評論 0 13
  • 本文內提到的內容來至于 Kernel Documentation。 協議被分為了兩種類型的設備: 所有設備都處理匿...
    走在成長的道路上閱讀 2,443評論 0 1