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

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

参考情報