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

Compose の方法を試す
Jetpack Compose は、Android に推奨される UI ツールキットです。Compose でタッチペンを使用する方法について学習します。

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 ベータ版を使用してテストします。

参考情報