觸控筆

Android 6.0 以上版本支援藍牙觸控筆的標準資料格式,可透過藍牙 (BT)、藍牙低功耗 (BTLE) 或 USB 連線。平台會比對觸控輸入和觸控筆資料之間的時間差,然後提供觸控筆資料,以便向使用中的應用程式算繪 MotionEvent。以下各節提供 OEM 裝置實作人員、觸控筆配件建立者和觸控筆應用程式開發人員的指南。

原始設備製造商 (OEM) 裝置實作人員指南

如要啟用藍牙觸控筆支援功能,OEM 裝置實作者必須支援藍牙 (且應支援 BTLE,以擴大相容性)。平台會處理資料收集、時間相關性和顯示作業,並將支援的觸控筆事件傳送至應用程式。

在 14 以上版本中,StylusButtonInputEventTest 會模擬連線的觸控筆行為,並測試按鈕事件是否正確回報。如要解決較舊版本的問題,建議您建立可模擬觸控筆事件的觸控筆配件或模擬器。

觸控筆配件建立者指南

如要在觸控筆裝置上實作支援功能,裝置實作者必須使用下方的觸控筆人機介面裝置 (HID) 描述元,說明如何表示觸控筆資料 (壓力感應、橡皮擦、按鈕、裝置 ID、電池電量、充電狀態等)。觸控筆裝置會將 HID 資訊傳送至 Android 行動裝置,讓平台能將 HID 資料與觸控螢幕的觸控資料相互關聯,並使用 MotionEvent 類別產生觸控筆事件。在 Android 14 以上版本中,按下觸控筆上的按鈕也會使用 KeyEvent 類別產生內部事件。資料可透過藍牙 (BT)、藍牙低功耗 (BTLE) 或 USB 傳送。

HID 描述元範例

下列範例 HID 描述元會回報筆尖接觸、壓力、主要和次要按鈕、 橡皮擦和序號。您加入的 HID 描述元應準確反映觸控筆透過藍牙回報的內容,這可能是可用功能的任何子集。
UsagePage(Digitizer)
Usage(Pen)
Collection(Application)
    Usage(Stylus)
    Collection(Logical)
        Usage(Tip Pressure)
        Logical Minimum(0)
        Logical Maximum(1023)
        Report Count(1)
        Report Size(10)
        Input(Data, Variable, Absolute, No Null)

        Usage(Barrel Switch)
        Usage(Secondary Barrel Switch)
        Usage(Tip Switch)
        Usage(Invert)
        Logical Maximum(1)
        Report Count(4)
        Report Size(1)
        Input(Data, Variable, Absolute, No Null)

        Usage(Transducer Serial Number)
        Report Count(1)
        Report Size(128)
        Feature(Constant, Variable)
    EndCollection
EndCollection

unsigned char HID_DESC[] = {
    0x05, 0x0D, // UsagePage(Digitizer)
    0x09, 0x02, // Usage(Pen)
    0xA1, 0x01, // Collection(Application)
    0x09, 0x20, // Usage(Stylus)
    0xA1, 0x02, // Collection(Logical)
    0x09, 0x30, // Usage(Tip Pressure)
    0x15, 0x00, // Logical Minimum(0)
    0x26, 0xFF, 0x03, // Logical Maximum(1023)
    0x95, 0x01, // Report Count(1)
    0x75, 0x0A, // Report Size(10)
    0x81, 0x02, // Input(Data, Variable, Absolute, No Null)

    0x09, 0x44, // Usage(Barrel Switch)
    0x09, 0x5A, // Usage(Secondary Barrel Switch)
    0x09, 0x42, // Usage(Tip Switch)
    0x09, 0x3C, // Usage(Invert)
    0x25, 0x01, // Logical Maximum(1)
    0x95, 0x04, // Report Count(4)
    0x75, 0x01, // Report Size(1)
    0x81, 0x02, // Input(Data, Variable, Absolute, No Null)

    0x09, 0x5B, // Usage(Transducer Serial Number)
    0x95, 0x01, // Report Count(1)
    0x75, 0x80, // Report Size(128)
    0xB1, 0x03, // Feature(Constant, Variable)
    0xC0, // End Collection
    0xC0, // End Collection
}

觸控筆應用程式開發人員指南

Android 平台會自動處理配對和事件關聯,因此現有和新應用程式預設都會支援藍牙觸控筆。如要進一步瞭解如何在 Android 應用程式中支援觸控筆,請參閱 Android 開發人員說明文件