Ввод стилусом в текстовых полях

Попробуйте Compose
Jetpack Compose – это рекомендуемый набор инструментов для создания пользовательского интерфейса в Android. Узнайте, как работать со стилусом в Compose.

На устройствах с Android 14 (уровень API 34) и более поздними версиями пользователи могут вводить текст стилусом в любом поле ввода в любом приложении. Поля для ввода текста в Android, включая компоненты EditText и текстовые виджеты WebView, по умолчанию поддерживают ввод с помощью стилуса.

Однако если в вашем приложении есть настраиваемые поля ввода текста (см. раздел Пользовательские текстовые редакторы) или сложный макет с полями ввода текста, наложенными на область рисования, вам потребуется настроить приложение.

Рисунок 1. Рукописный ввод с помощью стилуса.

EditText

На устройствах с Android 14 и более поздними версиями рукописный ввод стилусом по умолчанию включен для всех полей EditText. Режим рукописного ввода запускается для EditText, когда в границах рукописного ввода обнаруживается событие движения стилуса.

Границы рукописного ввода включают 40 dp вертикального отступа и 10 dp горизонтального отступа вокруг представления. Настройте границы рукописного ввода с помощью setHandwritingBoundsOffsets(). Отключите рукописный ввод с помощью setAutoHandwritingEnabled(false).

Поле ввода с прямоугольником, обозначающим границы для обнаружения событий движения стилуса.
Рисунок 2. Границы рукописного ввода для полей EditText.

Делегирование ввода

В приложениях могут быть элементы интерфейса, которые выглядят как поля ввода текста, но на самом деле являются статическими элементами без возможности ввода текста. Распространенный пример – поля поиска. При нажатии на статический элемент интерфейса открывается новый интерфейс с функциональным полем ввода текста, на котором установлен фокус.

Рисунок 3. Делегирование ввода от статического элемента интерфейса к полю ввода текста.

Делегирование ввода с помощью стилуса

Используйте API делегирования рукописного ввода, чтобы поддерживать рукописный ввод стилусом для полей ввода плейсхолдеров (см. setHandwritingDelegatorCallback() и setIsHandwritingDelegate()). Элемент интерфейса плейсхолдера настроен на делегирование рукописного ввода функциональному полю ввода, например:

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);
}

Движение стилуса над полем ввода текста-плейсхолдера вызывает обратный вызов. Обратный вызов запускает переход пользовательского интерфейса, чтобы показать и сфокусировать функциональное поле ввода. Реализация обратного вызова обычно такая же, как и для прослушивателя кликов по элементу-плейсхолдеру. Когда функциональное поле ввода создает InputConnection, запускается режим рукописного ввода стилусом.

Рисунок 4. Делегирование ввода стилусом от статического элемента интерфейса к полю ввода текста.

Material Design

Библиотека com.google.android.material.search предоставляет классы SearchBar и SearchView, которые упрощают реализацию шаблона интерфейса с плейсхолдером.

Плейсхолдер и функциональные представления поиска связаны с setUpWithSearchBar().

Делегирование рукописного ввода настраивается в библиотеке Material, и в приложении не требуется дополнительная разработка.

Перекрытие с поверхностями для рисования

Если в вашем приложении есть область для рисования с текстовым полем, вам может потребоваться отключить рукописный ввод, чтобы пользователь мог рисовать. Подробнее setAutoHandwritingEnabled()…

Тестирование

Рукописный ввод стилусом поддерживается на устройствах с Android 14 и более поздними версиями, совместимым стилусом и редактором метода ввода (IME), который поддерживает API рукописного ввода стилусом в Android 14.

Если у вас нет стилуса, вы можете имитировать его ввод на любом устройстве с root-доступом (включая эмуляторы), используя следующие команды 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.

Дополнительные ресурсы