Android 支援多種觸控螢幕和觸控板,包括 以觸控筆為基礎的數位化平板電腦。
「觸控螢幕」是指與螢幕相關聯的觸控裝置, 使用者感受到直接操控螢幕上的項目。
觸控式耳機是指與螢幕無關的觸控裝置,例如 以及數位平板電腦觸控板通常用於指向或 使用者介面的絕對間接定位或手勢控制。
觸控裝置上的按鈕功能與滑鼠按鈕類似,
觸控裝置有時也能使用多種不同工具操控 例如手指或觸控筆,視基礎觸控感應器技術而定
觸控裝置有時是用來實作虛擬金鑰。例如,在 部分 Android 裝置的觸控螢幕感應器區域延伸到 螢幕,以及雙重用途,為觸控敏感鍵盤的一部分。
Android 裝置搭載了眾多觸控裝置, 描述特性與所需行為 每部裝置的作業時間
觸控裝置分類
如果輸入裝置同時符合以下兩項條件,系統就會將輸入裝置歸類為「多點觸控」裝置 且符合下列條件:
- 輸入裝置會回報
ABS_MT_POSITION_X
和ABS_MT_POSITION_Y
的絕對軸。 - 輸入裝置沒有任何遊戲手把按鈕。這個條件 用於解決某些會回報軸,但會回報軸的遊戲區塊不明 與 MT 軸的那些點重疊
如果輸入裝置同時屬於「單一觸控」裝置, 並符合下列條件:
- 輸入裝置不是多點觸控裝置。輸入裝置 屬於單點觸控裝置或多點觸控裝置 永遠不會同時出現
- 輸入裝置回報
ABS_X
和ABS_Y
的絕對值 軸,以及BTN_TOUCH
按鍵碼。
如果輸入裝置歸類為觸控裝置, 虛擬金鑰的節點對應法是嘗試載入虛擬金鑰對應檔案。 供裝置使用如果有虛擬按鍵對應設定,接著使用按鍵配置 裝置的檔案也會一起載入。請參閱 [虛擬按鍵對應檔](#virtual-key-map-files) ,瞭解這些檔案的位置和格式。
接著,系統會載入觸控裝置的輸入裝置設定設定檔。
所有內建觸控裝置都必須有輸入裝置的設定檔。 如果沒有輸入裝置的設定檔,則系統會改為 選擇適合一般用途的預設設定 觸控週邊裝置,例如外部 USB 或藍牙 HID 觸控螢幕 或觸控墊這些預設值並非為內建觸控螢幕和 可能會導致系統出現錯誤行為
載入輸入裝置設定後,系統會將 做為觸控螢幕、觸控板或遊標裝置的輸入裝置。
- 觸控螢幕裝置可用來直接操控 。使用者直接觸碰螢幕,因此系統不會 需要任何其他用途,以指出 受到操弄。
- 觸控板裝置是用於提供絕對定位資訊 特定感應器區域的觸控動作所導向的應用程式。非常有幫助 數位平板電腦
- 指標裝置是用於間接操控 系統會將手指視為多點觸控指標 手勢。觸控筆等其他工具解讀時使用的是 做為絕對位置詳情請見 間接多點觸控指標 手勢。
下列規則會將輸入裝置分類為觸控螢幕。 觸控板或指標裝置
- 如果已設定
touch.deviceType
屬性,則裝置類型為 調整設定 - 如果輸入裝置回報
INPUT_PROP_DIRECT
是否存在 輸入屬性 (透過EVIOCGPROP
ioctl),則裝置類型為 已設為觸控螢幕。這個條件是假設使用者直接輸入觸控操作 裝置都連接到另一部已連接的螢幕。 - 如果輸入裝置回報
INPUT_PROP_POINTER
是否存在 輸入屬性 (透過EVIOCGPROP
ioctl),然後是裝置類型 設為 pointer。 - 如果輸入裝置回報
REL_X
或REL_Y
存在 請將裝置類型設為「觸控板」。這個條件 解決由滑鼠和 使用觸控板在這種情況下,無法使用觸控板進行控制 因為滑鼠已控制指標 - 否則,裝置類型會設為「pointer」。這個預設設定能確保 並未指明任何其他特殊用途的觸控墊 控制指標
按鈕
按鈕是「選用」的控制項,可供應用程式執行 以及函式觸控裝置上的按鈕的運作方式與滑鼠類似 主要與指標類型的觸控裝置或 觸控筆。
目前支援下列按鈕:
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
。
懸停與觸控工具
使用者可以與觸控裝置聯繫,或是位於連線範圍內 上方。並非所有觸控裝置都能感應到工具是否存在 將滑鼠遊標懸停在觸控裝置上方。包括以 RF 為基礎的觸控筆數位化工具 通常可以偵測到工具是否在數位化器的有限範圍內。
InputReader
元件會區分觸控工具與懸停工具
工具。同樣地,輕觸工具和懸停工具也會回報給應用程式
更新 Deployment
系統會將觸控工具回報為觸控事件
使用 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
指出工具是否為 請輕觸螢幕。因此,請勿使用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 當相關聯的工具超出範圍時,就可以重複使用。ABS_MT_SLOT
:(選用) 回報工具的版位 ID;使用 Linux 多點觸控通訊協定「B」。請參閱 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
軸則定義裝置可用區域的邊界 提供每部裝置專屬的途徑單元數如果是觸控螢幕,則運作中區域 描述觸控裝置實際覆蓋螢幕的部分。針對觸控螢幕,系統會自動插入回報的觸控動作 放置在表面單位中,以便取得以螢幕像素為單位的觸控位置 計算公式如下:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
觸控螢幕可能會回報位於活動區域以外的觸控位置。
在活動區域外啟動的觸控操作無法傳遞至應用程式 但可用於虛擬金鑰
在有效區域內啟動,或是進入及離開顯示畫面的觸控動作 因此,如果觸控程序會在 然後離開活動區域,也就是應用程式。 可能會收到顯示座標為負數或大於 螢幕邊界。請放心,這是正常情況。
觸控裝置的觸控座標不得限制於使用中邊界 如果觸控離開有效區域,則應回報為不在有效區域 有效區域,或完全不應回報該區域。
舉例來說,如果使用者的手指輕觸靠近應用程式 可能會回報座標 (minX、minY)。如果手指繼續 如果要將焦點移至有效區域以外的地方,觸控螢幕應從起始位置開始 小於 minX 和 minY 的元件,例如 (最小值 - 2,分鐘 - 3),否則應該停止回報觸控。 換句話說,觸控螢幕不應回報 (minX、minY) 當使用者的手指確實碰觸到活動區域之外。
將觸控座標貼近螢幕邊緣,營造人造的 螢幕邊緣的硬界線 流暢地追蹤進入或離開顯示區域邊界的動作。
ABS_PRESSURE
或ABS_MT_PRESSURE
回報的值 (如果有的話) 在工具觸碰裝置時,必須一律為零。 或 0,表示工具正在懸停。報表壓力資訊是選填欄位,但強烈建議提供。 應用程式可以利用壓力資訊進行壓力感測 和其他效果
「
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
,則工具 使用者無法移動遊標位置。 - 如果這項工具已啟用,且駕駛人回報壓力資訊, 且回報的壓力為 0,就代表工具目前是懸停在
- 如果工具已啟用,且驅動程式支援
BTN_TOUCH
按鍵碼和BTN_TOUCH
的值為 0,表示工具正在懸停。
- 如果工具是
InputReader
同時支援多點觸控通訊協定「A」和「B」新司機 應該使用「B」兩者都有用自 Android 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 裝置上的觸控裝置作業。
EventHub
會從evdev
驅動程式讀取原始事件。InputReader
會使用原始事件,並更新 每項工具的位置和其他特性它還會追蹤 按鈕狀態。- 如果按下「BACK」或「FORWARD」,請執行以下操作:
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
。
輸出範圍
以下運算式表示輸出座標系統的特性。 系統會使用線性內插類型,將觸控位置資訊從 由觸控裝置使用的表面單位轉換成 向應用程式回報的次數
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
,系統會自動偵測裝置類型 根據分類演算法套用不同的字詞
詳情請參閱「分類」一節 裝置類型對觸控裝置行為的影響。
在 Android 3 及以下版本中,所有觸控裝置都視為觸控螢幕。
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
Touch Major, TouchMinor, ToolMajor, ToolMinor, size fields
touchMajor
和 touchMinor
欄位說明概略維度
以輸出單位 (像素) 為單位。
toolMajor
和 toolMinor
欄位說明概略維度
工具本身的輸出內容單位 (像素)。
size
欄位會說明相對於應用程式的正規化大小
代表觸控裝置可感應的最大觸控度。最小
可能的正規化大小為 0.0 (未接觸或不可評估),而最大
可能的正規化大小為 1.0 (感應器區域已飽和)。
如果可以測量約略長度和廣度,
touchMajor
欄位
指定較長的維度,而 touchMinor
欄位則指定較短的維度
聯絡區域如果只能測量接觸區域的約略直徑,
那麼 touchMajor
和 touchMinor
欄位會相等。
同樣地,toolMajor
欄位會指定較長的維度,
toolMinor
欄位會指定工具跨區段區域的較短尺寸。
如果無法使用觸控大小,但可使用工具大小,則代表工具大小 會等於觸控大小。反之,如果無法使用工具大小 但觸控大小設為與工具大小相等。
觸控裝置會以各種方式測量或回報觸控大小和工具大小。 目前的導入方式支援三種不同評估方式: 直徑、面積和幾何圖形的邊框,單位為表面單位
定義: touch.size.calibration
= none
|
geometric
|diameter
|area
|default
指定觸控驅動程式用於回報的測量種類 觸控大小和工具大小
-
如果值為
none
,則大小會設為 0。 -
如果值為
geometric
,系統會假設在同一處指定大小 做為位置的表面,因此兩者的縮放方式是一樣的。 -
如果值為
diameter
,系統會假設該大小等於 觸控或工具的直徑 (寬度)。 -
如果值為
area
,系統會假設該大小與 輕觸或工具的面積 -
如果值為
default
,系統會在下列情況使用geometric
校正: 可提供raw.touchMajor
或raw.toolMajor
軸,否則會使用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
,回報的大小除以數字 聯絡人使用前的 100 個聯絡人 -
如果值為
0
,則會使用回報的大小。
預設值為 0
。
某些觸控裝置,特別是「半 M-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
欄位會說明套用至
以 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
欄位說明觸控的方向和工具做為
角測量值。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
欄位說明工具和觸控裝置之間的距離
途徑。如果值為 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 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>
的檔案做為 Jamboard 屬性。例如:
觸控螢幕裝置驅動程式回報名稱為「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
在上例中,觸控螢幕的解析度為 480x800。因此, 虛擬金鑰的 <centerY>和 835 的座標,後者稍微低於 觸控螢幕的顯示區域
第一個金鑰的 Linux 掃描碼是 158
(KEY_BACK
),中樞:
55
,835
的置中,90
的寬度,高度
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 172 HOME key 217 SEARCH
按鍵字元對應檔案:/system/usr/keychars/touchyfeely.kcm
。
type SPECIAL_FUNCTION
間接多點觸控指標
在指標模式中,系統會解讀下列手勢:
- 單指輕觸:點選。
- 單指移動:移動指標。
- 單指動作和按鈕按下:拖曳指標。
- 兩指同時移動兩根手指,朝同一方向移動:拖曳指標下方的區域 朝著這個方向前進指標本身不會移動。
- 兩指同時移動或向外移動 不同方向:平移/縮放/旋轉指標周圍的區域。 指標本身不會移動。
- 多指動作:任意形式手勢。
防止誤觸
自 Android 13 起,系統可以自動拒絕來自手掌的輸入內容
當內建架構啟用時系統仍支援內部的自訂解決方案
但可能需要修改,才能在手掌時傳回 TOOL_TYPE_PALM
標記
。這類內建架構也能搭配自訂解決方案使用。
實際模型會觀察前 90 毫秒的手勢資料、目前的指標,以及
然後考量觸控與螢幕邊緣之間的距離。
接著,它會根據指標判斷指標,哪一個指標為手掌。該模型的
計算每位聯絡人的大小 (由 touchMajor
回報,以及
touchMinor
。接著,Android 架構會移除標示為
手掌放在觸控串流中
如果指標已傳送至應用程式,系統會採取下列其中一種做法:
- (如有其他進行中的指標) 使用
ACTION_POINTER_UP
取消指標 並設定FLAG_CANCELED
。 - (如果這是唯一的指標) 使用
ACTION_CANCEL
取消指標。
公用 API MotionEvent.FLAG_CANCELED
表示目前使用
事件不應觸發使用者動作。已為 ACTION_CANCEL
設定這個標記
和 ACTION_POINTER_UP
。
如果手掌指標未傳送至應用程式,則系統會直接放置指標。
啟用防手掌誤觸功能
- 開啟觸控驅動程式,並使用
input_abs_set_res
巨集 設定下列欄位的解析度 (單位為 每公釐像素):ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_TOUCH_MAJOR
ABS_MT_TOUCH_MINOR
您可以選擇是否支援
ABS_MT_TOUCH_MINOR
。但如果裝置使用 支援,請確認解析度設定正確無誤。 - 如要確認欄位設定是否正確無誤,請執行以下指令:
$ adb shell getevent -li
- 如要在執行階段啟用此功能,請執行:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- 重新啟動
system_server
程序。$ adb shell stop && adb shell start
- 確認
adb shell dumpsys input
顯示裡面有手掌拒絕器UnwantedInteractionBlocker
。如果沒有,請查看輸入相關記錄檔來尋找 還會找出可能設定錯誤的線索請參考以下範例:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =
max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - 如要永久啟用這項功能,請在以下項目中加入對應的 sysprop 指令
init**rc
敬上 檔案:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1