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

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

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

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

EditText

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

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

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

Входное делегирование

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

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

Делегирование ввода стилуса

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

Котлин

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

Ява

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

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

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

Материальный дизайн

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

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

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

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

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

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