在文字欄位中使用觸控筆輸入內容

Android 14 (API 級別 34) 以上版本可讓使用者使用觸控筆在任何應用程式中寫入任何文字輸入欄位。根據預設,Android 文字輸入欄位 (包括 EditText 元件和 WebView 文字小工具) 支援觸控筆輸入功能。

不過,如果您的應用程式需要自訂文字輸入欄位 (請參閱「自訂文字編輯器」),或是複雜的版面配置,版面配置會在繪圖介面上疊加文字輸入欄位,您就必須自訂應用程式。

圖 1. 使用觸控筆手寫輸入。

EditText

根據預設,Android 14 以上版本的所有 EditText 欄位都會啟用觸控筆手寫功能。如果在檢視畫面的手寫範圍內偵測到觸控筆動作事件,系統就會啟動 EditText 的手寫模式。

手寫邊界包括 40 dp 的垂直邊框間距,以及檢視畫面周圍 10 dp 的水平邊框間距。使用 setHandwritingBoundsOffsets() 調整手寫邊界。使用 setAutoHandwritingEnabled(false) 停用手寫功能。

包含矩形的輸入欄位,用來表示偵測觸控筆動作事件的邊界。
圖 2. EditText 欄位的手寫範圍。

輸入委派

應用程式可以顯示顯示為文字輸入欄位的預留位置 UI 元素,但實際上是不具文字輸入功能的靜態 UI 元素。搜尋欄位也是常見的範例。輕觸靜態 UI 元素會觸發轉換至新 UI,其中包含可聚焦輸入欄位的可運作文字輸入欄位。

圖 3. 從靜態 UI 元素到文字輸入欄位的輸入委派。

觸控筆輸入委派

使用手寫委派 API,為預留位置輸入欄位支援觸控筆手寫輸入功能 (請參閱 setHandwritingDelegatorCallback()setIsHandwritingDelegate())。預留位置 UI 元素已設為將手寫內容委派給函式的輸入欄位,例如:

Kotlin

if (Build.VERSION.SDK_INT >= 34) {
    placeholderInputField.setHandwritingDelegatorCallback {
        showAndFocusDelegateInputField()
    }
    delegateInputField.setIsHandwritingDelegate(true)
}

Java

if (Build.VERSION.SDK_INT >= 34) {
    placeholderInputField.setHandwritingDelegatorCallback(this::showAndFocusInputFieldDelegate);
    delegateInputField.setIsHandwritingDelegate(true);
}

預留位置文字輸入欄位檢視畫面上的觸控筆動作會叫用回呼。回呼會觸發 UI 轉換,顯示並聚焦功能輸入欄位。回呼的實作方式通常與預留位置元素上點擊事件監聽器的實作方式相同。當函式輸入欄位建立 InputConnection 時,系統會啟動觸控筆手寫模式。

圖 4. 從靜態 UI 元素到文字輸入欄位的觸控筆輸入委派。

質感設計

com.google.android.material.search 程式庫提供 SearchBarSearchView 類別,可協助您實作預留位置 UI 模式。

預留位置和功能搜尋檢視畫面會與 setUpWithSearchBar() 連結。

手寫委派功能是在 Material 程式庫中設定,不必在應用程式中進行額外開發作業。

與繪圖介面重疊

如果應用程式有疊加在介面上的文字欄位,您可能需要停用觸控筆手寫功能,才能允許使用者繪圖。詳情請參閱 setAutoHandwritingEnabled()

測試

觸控筆手寫功能適用於搭載相容觸控筆輸入裝置的 Android 14 以上版本裝置,以及支援 Android 14 觸控筆手寫 API 的輸入法編輯器 (IME)。

如果您沒有觸控筆輸入裝置,請使用以下 Android Debug Bridge (ADB) 指令,在任何具備 Root 存取權的裝置 (包括模擬器) 上模擬觸控筆輸入:


// Android 14
adb shell setprop persist.debug.input.simulate_stylus_with_touch true && adb shell stop && adb shell start

// Android 15 and higher
// Property takes effect after screen reconfiguration such as orientation change.
adb shell setprop debug.input.simulate_stylus_with_touch true

如果您使用的裝置不支援觸控筆,請使用 Gboard Beta 版進行測試。

其他資源