テキスト フィールドのタッチペン入力

Android 14(API レベル 34)以降では、タッチペンを使用して、アプリ内の任意のテキスト入力フィールドに書き込むことができます。EditText コンポーネントや WebView テキスト ウィジェットなどの Android テキスト入力フィールドは、デフォルトでタッチペン入力をサポートしています。

ただし、アプリでカスタム テキスト入力フィールドが必要な場合(カスタム テキスト エディタを参照)、またはテキスト入力フィールドが描画サーフェスに重なる複雑なレイアウトの場合は、アプリをカスタマイズする必要があります。

図 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 ライブラリには、プレースホルダ UI パターンの実装を容易にする SearchBar クラスと SearchView クラスが用意されています。

プレースホルダと機能検索ビューは setUpWithSearchBar() とリンクされています。

手書き入力の委任はマテリアル ライブラリで設定されるため、アプリで追加の開発を行う必要はありません。

描画サーフェスと重なる

アプリの描画サーフェスにテキスト フィールドが重なっている場合、ユーザーが描画できるようにするには、タッチペンの手書き入力を無効にする必要があります。setAutoHandwritingEnabled() をご覧ください。

テスト

タッチペンの手書き入力は、互換性のあるタッチペン入力デバイスと、Android 14 のタッチペン手書き入力 API をサポートするインプット メソッド エディタ(IME)を備えた Android 14 以降のデバイスでサポートされています。

タッチペン入力デバイスがない場合は、次の Android Debug Bridge(adb)コマンドを使用して、ルートアクセス権限のあるデバイス(エミュレータを含む)でタッチペン入力をシミュレートします。


// 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 ベータ版を使用してテストしてください。

参考情報