觸控式裝置

Android 支援多種觸控螢幕和觸控板,包括 以觸控筆為基礎的數位化平板電腦。

觸控螢幕」是指與螢幕相關聯的觸控裝置, 使用者感受到直接操控螢幕上的項目。

觸控式耳機是指與螢幕無關的觸控裝置,例如 以及數位平板電腦觸控板通常用於指向或 使用者介面的絕對間接定位或手勢控制。

觸控裝置上的按鈕功能與滑鼠按鈕類似,

觸控裝置有時也能使用多種不同工具操控 例如手指或觸控筆,視基礎觸控感應器技術而定

觸控裝置有時是用來實作虛擬金鑰。例如,在 部分 Android 裝置的觸控螢幕感應器區域延伸到 螢幕,以及雙重用途,為觸控敏感鍵盤的一部分。

Android 裝置搭載了眾多觸控裝置, 描述特性與所需行為 每部裝置的作業時間

觸控裝置分類

如果輸入裝置同時符合以下兩項條件,系統就會將輸入裝置歸類為「多點觸控」裝置 且符合下列條件:

  • 輸入裝置會回報 ABS_MT_POSITION_XABS_MT_POSITION_Y 的絕對軸。
  • 輸入裝置沒有任何遊戲手把按鈕。這個條件 用於解決某些會回報軸,但會回報軸的遊戲區塊不明 與 MT 軸的那些點重疊

如果輸入裝置同時屬於「單一觸控」裝置, 並符合下列條件:

  • 輸入裝置不是多點觸控裝置。輸入裝置 屬於單點觸控裝置或多點觸控裝置 永遠不會同時出現
  • 輸入裝置回報 ABS_XABS_Y 的絕對值 軸,以及 BTN_TOUCH 按鍵碼。

如果輸入裝置歸類為觸控裝置, 虛擬金鑰的節點對應法是嘗試載入虛擬金鑰對應檔案。 供裝置使用如果有虛擬按鍵對應設定,接著使用按鍵配置 裝置的檔案也會一起載入。請參閱 [虛擬按鍵對應檔](#virtual-key-map-files) ,瞭解這些檔案的位置和格式。

接著,系統會載入觸控裝置的輸入裝置設定設定檔。

所有內建觸控裝置都必須有輸入裝置的設定檔。 如果沒有輸入裝置的設定檔,則系統會改為 選擇適合一般用途的預設設定 觸控週邊裝置,例如外部 USB 或藍牙 HID 觸控螢幕 或觸控墊這些預設值並非為內建觸控螢幕和 可能會導致系統出現錯誤行為

載入輸入裝置設定後,系統會將 做為觸控螢幕觸控板遊標裝置的輸入裝置。

  • 觸控螢幕裝置可用來直接操控 。使用者直接觸碰螢幕,因此系統不會 需要任何其他用途,以指出 受到操弄。
  • 觸控板裝置是用於提供絕對定位資訊 特定感應器區域的觸控動作所導向的應用程式。非常有幫助 數位平板電腦
  • 指標裝置是用於間接操控 系統會將手指視為多點觸控指標 手勢。觸控筆等其他工具解讀時使用的是 做為絕對位置詳情請見 間接多點觸控指標 手勢

下列規則會將輸入裝置分類為觸控螢幕。 觸控板或指標裝置

  • 如果已設定 touch.deviceType 屬性,則裝置類型為 調整設定
  • 如果輸入裝置回報INPUT_PROP_DIRECT是否存在 輸入屬性 (透過 EVIOCGPROP ioctl),則裝置類型為 已設為觸控螢幕。這個條件是假設使用者直接輸入觸控操作 裝置都連接到另一部已連接的螢幕。
  • 如果輸入裝置回報INPUT_PROP_POINTER是否存在 輸入屬性 (透過 EVIOCGPROP ioctl),然後是裝置類型 設為 pointer
  • 如果輸入裝置回報 REL_XREL_Y 存在 請將裝置類型設為「觸控板」。這個條件 解決由滑鼠和 使用觸控板在這種情況下,無法使用觸控板進行控制 因為滑鼠已控制指標
  • 否則,裝置類型會設為「pointer」。這個預設設定能確保 並未指明任何其他特殊用途的觸控墊 控制指標

按鈕

按鈕是「選用」的控制項,可供應用程式執行 以及函式觸控裝置上的按鈕的運作方式與滑鼠類似 主要與指標類型的觸控裝置或 觸控筆。

目前支援下列按鈕:

  • BTN_LEFT:已對應到 MotionEvent.BUTTON_PRIMARY
  • BTN_RIGHT:已對應到 MotionEvent.BUTTON_SECONDARY
  • BTN_MIDDLE:已對應到 MotionEvent.BUTTON_MIDDLE
  • BTN_BACKBTN_SIDE:已對應至 MotionEvent.BUTTON_BACK。 按下這個按鈕也會使用按鍵碼合成按鍵 KeyEvent.KEYCODE_BACK
  • BTN_FORWARDBTN_EXTRA:已對應至 MotionEvent.BUTTON_FORWARD。按下這個按鈕也會合成按鍵動作 與按鍵碼 KeyEvent.KEYCODE_FORWARD 搭配使用。
  • BTN_STYLUS:已對應到 MotionEvent.BUTTON_SECONDARY
  • BTN_STYLUS2:已對應到 MotionEvent.BUTTON_TERTIARY

工具和工具類型

工具是指用於互動的手指、觸控筆或其他裝置 操作裝置。某些觸控裝置可以區分 提供不同類型的工具

在 Android 的其他地方,就像在 MotionEvent API 中一樣,我們通常會使用工具 視為指標

支援的工具類型如下:

  • BTN_TOOL_FINGERMT_TOOL_FINGER:已對應至 MotionEvent.TOOL_TYPE_FINGER
  • BTN_TOOL_PENMT_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_DOUBLETAPBTN_TOOL_TRIPLETAPBTN_TOOL_QUADTAP:已對應到 MotionEvent.TOOL_TYPE_FINGER

懸停與觸控工具

使用者可以與觸控裝置聯繫,或是位於連線範圍內 上方。並非所有觸控裝置都能感應到工具是否存在 將滑鼠遊標懸停在觸控裝置上方。包括以 RF 為基礎的觸控筆數位化工具 通常可以偵測到工具是否在數位化器的有限範圍內。

InputReader 元件會區分觸控工具與懸停工具 工具。同樣地,輕觸工具和懸停工具也會回報給應用程式 更新 Deployment

系統會將觸控工具回報為觸控事件 使用 MotionEvent.ACTION_DOWNMotionEvent.ACTION_MOVEMotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWNMotionEvent.ACTION_POINTER_UP

系統會將懸停工具回報為使用一般動作事件的應用程式 MotionEvent.ACTION_HOVER_ENTERMotionEvent.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_LEFTBTN_RIGHTBTN_MIDDLEBTN_BACKBTN_SIDEBTN_FORWARDBTN_EXTRABTN_STYLUSBTN_STYLUS2(選用)「報表」按鈕狀態。
    • BTN_TOOL_FINGERBTN_TOOL_PENBTN_TOOL_RUBBERBTN_TOOL_BRUSHBTN_TOOL_PENCILBTN_TOOL_AIRBRUSHBTN_TOOL_MOUSEBTN_TOOL_LENSBTN_TOOL_DOUBLETAPBTN_TOOL_TRIPLETAPBTN_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_FINGERMT_TOOL_PEN
    • ABS_MT_TRACKING_ID(選用) 回報工具的追蹤 ID。 追蹤 ID 是任意非負數的整數,用來辨識 並在啟用多項工具時分別追蹤每項工具例如: 如果有多指觸碰裝置,則每指的手指都應指派不重複的 追蹤編號 (只要手指仍在接觸即可)。追蹤 ID 當相關聯的工具超出範圍時,就可以重複使用。
    • ABS_MT_SLOT(選用) 回報工具的版位 ID;使用 Linux 多點觸控通訊協定「B」。請參閱 Linux 多點觸控通訊協定說明文件 ,掌握更多詳細資訊。
    • BTN_TOUCH(必要):指出工具是否觸碰 裝置。
    • BTN_LEFTBTN_RIGHTBTN_MIDDLEBTN_BACKBTN_SIDEBTN_FORWARDBTN_EXTRABTN_STYLUSBTN_STYLUS2(選用)「報表」按鈕狀態。
    • BTN_TOOL_FINGERBTN_TOOL_PENBTN_TOOL_RUBBERBTN_TOOL_BRUSHBTN_TOOL_PENCILBTN_TOOL_AIRBRUSHBTN_TOOL_MOUSEBTN_TOOL_LENS, BTN_TOOL_DOUBLETAPBTN_TOOL_TRIPLETAPBTN_TOOL_QUADTAP(選用) 回報工具類型
  • 如果已定義單點觸控和多點觸控通訊協定的軸,則 系統只會使用多點觸控軸,並忽略單點觸控軸。
  • ABS_XABS_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_PRESSUREABS_MT_PRESSURE 回報的值 (如果有的話) 在工具觸碰裝置時,必須一律為零。 或 0,表示工具正在懸停。

    報表壓力資訊是選填欄位,但強烈建議提供。 應用程式可以利用壓力資訊進行壓力感測 和其他效果

  • ABS_TOOL_WIDTH」回報的值、ABS_MT_TOUCH_MAJORABS_MT_TOUCH_MINORABS_MT_WIDTH_MAJOR 或 當工具時,ABS_MT_WIDTH_MINOR 應為非零 只要碰觸裝置,再按零即可,但仍然可以執行。 舉例來說,觸控裝置可能可以測量手指觸控大小 聯絡人,而非觸控筆觸控聯絡人。

    報表大小資訊為選填屬性,但強烈建議使用。 應用程式可以利用壓力資訊,實作大小敏感的繪圖 和其他效果

  • ABS_DISTANCEABS_MT_DISTANCE 回報的值應 圖示。距離可以保持非零 即使工具與直接聯繫也無妨回報的確切值 硬體測量距離的方式

    報表距離資訊為選填屬性,但建議用於 觸控筆裝置

  • ABS_TILT_XABS_TILT_Y 回報的值應為零 。傾斜度以外的傾斜角度 感覺工具在斜坡上擺動

    假設 X 軸和 Y 軸的傾斜角度會假設為角度 垂直高度已指定聚焦點 (完美垂直) 除以各軸的 (max + min) / 2。小於中心點的值 代表向上或向左傾斜的值,顯示的值大於中心點 代表向下或右側的傾斜

    InputReader 可將 X 和 Y 傾斜元件轉換為垂直方向 傾斜角度,範圍介於 0 到 PI / 2 弧度,以及平面方向角度 範圍從 -PIPI 弧度。這個表示法 用來描述螢幕方向的方向 手指輕觸。

    雖然觸控筆裝置建議使用回報傾斜度資訊為「選用」選項。

  • 如果工具類型是由 ABS_MT_TOOL_TYPE 回報,將取代任何工具 類型資訊 (由 BTN_TOOL_* 回報)。 如果完全沒有可用的工具類型資訊,工具類型會預設為 MotionEvent.TOOL_TYPE_FINGER

  • 系統會依據下列條件判斷啟用工具:

    • 使用單點觸控通訊協定時,如果 BTN_TOUCH、 或 BTN_TOOL_* 為 1。

      這個條件表示 InputReader 至少需要 工具性質的相關資訊,無論是觸控或觸碰 至少一項工具類型如果沒有相關資訊 則工具會假設為閒置 (超出範圍)。

    • 使用多點觸控通訊協定「A」時,只要工具處於啟用狀態 會顯示在最新的同步處理報表中。工具停止出現在 同步處理報表即會停止運作。
    • 使用多點觸控通訊協定「B」時,只要 其中包含有效的版位一旦清除了版位,此工具就會停止運作。
  • 系統會根據下列條件,判斷應將遊標懸停在工具上:
    • 如果工具是 BTN_TOOL_MOUSEBTN_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 專屬的自訂功能。 透過採用標準 Linux 輸入通訊協定,Android 便能支援 支援更多觸控週邊裝置,例如外部 HID 多點觸控 觸控螢幕,使用未經修改的驅動程式。

觸控裝置作業

以下摘要說明 Android 裝置上的觸控裝置作業。

  1. EventHub 會從 evdev 驅動程式讀取原始事件。
  2. InputReader 會使用原始事件,並更新 每項工具的位置和其他特性它還會追蹤 按鈕狀態。
  3. 如果按下「BACK」或「FORWARD」,請執行以下操作: InputReader 會通知 InputDispatcher 關於重要事件。
  4. InputReader 可判斷是否發生虛擬按鍵。如果是, 就會通知 InputDispatcher 關於重要事件。
  5. InputReader 會判斷觸控啟動是否在 螢幕邊界。如果是,系統會通知 InputDispatcher 就會觸發觸控事件
  6. 如果沒有觸控工具,但至少有一個懸停工具: InputReader 會通知 InputDispatcher 懸停事件。
  7. 如果觸控裝置類型為「指標」InputReader 會執行指標 手勢偵測,據此移動指標和位置,並發出通知 指標事件的 InputDispatcher
  8. InputDispatcher 會使用 WindowManagerPolicy 判斷是否要 系統應指派事件,以及是否應喚醒裝置。 然後,InputDispatcher 會將事件傳送至適當的應用程式。

觸控裝置設定

觸控裝置行為取決於裝置的軸、按鈕、輸入屬性、 輸入裝置設定、虛擬按鍵對應和按鍵配置。

請參閱下列各節,進一步瞭解會 參與鍵盤設定:

屬性

系統需要許多輸入裝置設定屬性,才能設定 及校正觸控裝置行為。

其中一個原因是,觸控裝置的驅動程式經常回報 指定裝置專用單位的觸控特性

舉例來說,許多觸控裝置都會測量觸控接觸區域 使用內部裝置專屬的資源調度方法 例如要求存取的 藉由觸控動作觸發的感應器節點這個原始大小值 對應用程式而言不具意義,因為應用程式 實體大小和其他特徵的觸控裝置感應器節點特性

系統會使用輸入裝置設定編碼的校正參數 將檔案解碼、轉換及正規化輕觸所回報的值 讓應用程式更易於理解的標準表示法

說明文件慣例

針對說明文件,我們使用下列慣例來說明 也就是系統在校正過程中使用的值。

原始軸值

以下運算式表示觸控回報的原始值 視為 EV_ABS 事件。

raw.x
ABS_XABS_MT_POSITION_X 軸的值。
raw.y
ABS_YABS_MT_POSITION_Y 軸的值。
raw.pressure
ABS_PRESSUREABS_MT_PRESSURE 軸的值,如果值為 0, 無法使用。
raw.touchMajor
ABS_MT_TOUCH_MAJOR 軸的值;如果無法使用,則為 0。
raw.touchMinor
ABS_MT_TOUCH_MINOR 軸的值,raw.touchMajor 無法使用。
raw.toolMajor
ABS_TOOL_WIDTHABS_MT_WIDTH_MAJOR 軸的值,如果值為 0, 無法使用。
raw.toolMinor
ABS_MT_WIDTH_MINOR 軸的值;如果不行,則為 raw.toolMajor
raw.orientation
ABS_MT_ORIENTATION 軸的值;如果無法使用,則為 0。
raw.distance
ABS_DISTANCEABS_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,則觸控裝置回報的觸控位置不會免疫 顯示方向變更

如果裝置是觸控螢幕,則預設值為 10 反之。

系統會區分內部和外部觸控螢幕和螢幕。 螢幕方向感知時,內部觸控螢幕會根據螢幕方向旋轉 內部螢幕的底部螢幕方向感知功能外部觸控螢幕已旋轉 垂直旋轉功能會根據螢幕方向調整

螢幕方向感知功能是用於支援裝置觸控螢幕的旋轉方向 例如 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

touchMajortouchMinor 欄位說明概略維度 以輸出單位 (像素) 為單位。

toolMajortoolMinor 欄位說明概略維度 工具本身的輸出內容單位 (像素)。

size 欄位會說明相對於應用程式的正規化大小 代表觸控裝置可感應的最大觸控度。最小 可能的正規化大小為 0.0 (未接觸或不可評估),而最大 可能的正規化大小為 1.0 (感應器區域已飽和)。

如果可以測量約略長度和廣度, touchMajor 欄位 指定較長的維度,而 touchMinor 欄位則指定較短的維度 聯絡區域如果只能測量接觸區域的約略直徑, 那麼 touchMajortouchMinor 欄位會相等。

同樣地,toolMajor 欄位會指定較長的維度, toolMinor 欄位會指定工具跨區段區域的較短尺寸。

如果無法使用觸控大小,但可使用工具大小,則代表工具大小 會等於觸控大小。反之,如果無法使用工具大小 但觸控大小設為與工具大小相等。

觸控裝置會以各種方式測量或回報觸控大小和工具大小。 目前的導入方式支援三種不同評估方式: 直徑、面積和幾何圖形的邊框,單位為表面單位

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

指定觸控驅動程式用於回報的測量種類 觸控大小和工具大小

  • 如果值為 none,則大小會設為 0。

  • 如果值為 geometric,系統會假設在同一處指定大小 做為位置的表面,因此兩者的縮放方式是一樣的。

  • 如果值為 diameter,系統會假設該大小等於 觸控或工具的直徑 (寬度)。

  • 如果值為 area,系統會假設該大小與 輕觸或工具的面積

  • 如果值為 default,系統會在下列情況使用 geometric 校正: 可提供 raw.touchMajorraw.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

計算方式

touchMajortouchMinortoolMajortoolMinor、 和 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 表示大軸朝右方。使用觸控筆時 工具時,系統會以整個圓形範圍描述方向範圍 最低價格:-PIPI

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

計算方式

orientationtilt 欄位的計算取決於 指定的校正參數和可用的輸入內容。

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),中樞: 55835 的置中,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

如果手掌指標未傳送至應用程式,則系統會直接放置指標。

啟用防手掌誤觸功能

  1. 開啟觸控驅動程式,並使用 input_abs_set_res 巨集 設定下列欄位的解析度 (單位為 每公釐像素):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    您可以選擇是否支援 ABS_MT_TOUCH_MINOR。但如果裝置使用 支援,請確認解析度設定正確無誤。

  2. 如要確認欄位設定是否正確無誤,請執行以下指令:
        $ adb shell getevent -li
    
  3. 如要在執行階段啟用此功能,請執行:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. 重新啟動 system_server 程序。
         $ adb shell stop && adb shell start
        
  5. 確認 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: {}
    
  6. 如要永久啟用這項功能,請在以下項目中加入對應的 sysprop 指令 init**rc敬上 檔案:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

其他資訊