GameTextInput Часть Android Game Development Kit.
Использование библиотеки GameTextInput – это более простой способ реализовать полноэкранное приложение Android, в котором для ввода текста используется экранная клавиатура.
GameTextInput предоставляет простой API для показа или скрытия экранной клавиатуры, установки или получения текущего редактируемого текста и получения уведомлений при изменении текста. Это не полноценный текстовый редактор, но он поддерживает выделение и ввод текста в типичных игровых сценариях. Кроме того, эта библиотека поддерживает расширенные функции редактора методов ввода (IME), такие как проверка правописания, автозаполнение и многоклавишные символы.
GameTextInputВнутренний буфер GameTextInput::currentState_ накапливает входной текст (вместе с
соответствующими состояниями) и уведомляет
приложение о любых изменениях в нем. Затем приложение обрабатывает текст в зарегистрированной функции обратного вызова.
Доступность
GameTextInput можно использовать следующими способами:
Вместе с GameActivity: GameActivity интегрирует GameTextInput. Приложения, в которых используется GameActivity, могут работать только со встроенным GameTextInput. Инструкции по использованию полностью описаны на странице GameActivity . Пример интеграции GameActivity и GameTextInput можно найти в репозитории games-samples. Эта модель использования не рассматривается в данном руководстве.
Как отдельную библиотеку. В остальной части руководства описаны шаги по использованию.
Обратите внимание, что эти два метода являются взаимоисключающими.
Официальные выпуски GameTextInput доступны в библиотеке игр Jetpack в Google Maven.
Как настроить сборку
GameTextInput распространяется в виде архива Android (AAR). Этот AAR-файл содержит классы Java и исходный код на языке C, в котором реализованы встроенные функции GameTextInput. Вам нужно включить эти исходные файлы в процесс сборки с помощью Prefab, который предоставляет доступ к нативным библиотекам и исходному коду в проекте CMake или сборке NDK.
Следуйте инструкциям на странице Jetpack Android Games, чтобы добавить зависимость библиотеки
GameTextInputв файлbuild.gradleигры. Обратите внимание, что если в ваших приложениях используется GameActivity, то они не могут использовать отдельную библиотекуGameTextInput.Убедитесь, что файл
gradle.propertiesсодержит следующие строки:# Tell Android Studio we are using AndroidX. android.useAndroidX=true # Use Prefab 1.1.2 or higher, which contains a fix for "header only" libs. android.prefabVersion=1.1.2 # Required only if you're using Android Studio 4.0 (4.1 is recommended). # android.enablePrefab=trueИмпортируйте пакет
game-text-inputи добавьте его в цель в файлеCMakeLists.txtпроекта:find_package(game-text-input REQUIRED CONFIG) ... target_link_libraries(... game-text-input::game-text-input)В один из файлов
.cppв игре добавьте следующую строку, чтобы включить реализациюGameTextInput:#include <game-text-input/gametextinput.cpp>В исходных файлах, где используется
GameTextInputC API, добавьте заголовочный файл:#include <game-text-input/gametextinput.h>Скомпилируйте и запустите приложение. Если возникнут ошибки CMake, проверьте, правильно ли настроены файлы AAR и
build.gradle. Если файл#includeне найден, проверьте файл конфигурацииCMakeLists.txt.
Интеграция сборки
Из потока C, который уже прикреплен к JVM, или основного потока приложения вызовите
GameTextInput_initс указателемJNIEnv.static GameTextInput* gameTextInput = nullptr; extern "C" JNIEXPORT void JNICALL Java_com_gametextinput_testbed_MainActivity_onCreated(JNIEnv* env, jobject this) { { if(!gameTextInput) gameTextInput = GameTextInput_init(env); ... }Создайте класс Java
InputEnabledTextViewс доступом кInputConnection.public class InputEnabledTextView extends View implements Listener { public InputConnection mInputConnection; public InputEnabledTextView(Context context, AttributeSet attrs) { super(context, attrs); } public InputEnabledTextView(Context context) { super(context); } public void createInputConnection(int inputType) { EditorInfo editorInfo = new EditorInfo(); editorInfo.inputType = inputType; editorInfo.actionId = IME_ACTION_NONE; editorInfo.imeOptions = IME_FLAG_NO_FULLSCREEN; mInputConnection = new InputConnection(this.getContext(), this, new Settings(editorInfo, true) ).setListener(this); } @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { if (outAttrs != null) { GameTextInput.copyEditorInfo(mInputConnection.getEditorInfo(), outAttrs); } return mInputConnection; } // Called when the IME input changes. @Override public void stateChanged(State newState, boolean dismissed) { onTextInputEventNative(newState); } @Override public void onImeInsetsChanged(Insets insets) { // handle Inset changes here } private native void onTextInputEventNative(State softKeyboardEvent); }Добавьте созданный объект
InputEnabledTextViewв макет пользовательского интерфейса. Например, следующий код вactivity_main.xmlпозволяет разместить его в нижней части экрана:<com.android.example.gametextinputjava.InputEnabledTextView android:id="@+id/input_enabled_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" />Получите новый класс
InputEnabledTextViewдля своего действия Java. Это довольно просто сделать с помощью привязки представлений:public class MainActivity extends AppCompatActivity { ... private ActivityMainBinding binding; private InputEnabledTextView inputEnabledTextView; private native void setInputConnectionNative(InputConnection c); @Override protected void onCreate(Bundle savedInstanceState) { ... binding = ActivityMainBinding.inflate(getLayoutInflater()); inputEnabledTextView = binding.inputEnabledTextView; inputEnabledTextView.createInputConnection(InputType.TYPE_CLASS_TEXT); setInputConnectionNative(inputEnabledTextView.mInputConnection); }В библиотеке C передайте
inputConnectionв функциюGameTextInput_setInputConnection. Передайте обратный вызов вGameTextInput_setEventCallback, чтобы получать уведомления о событиях в виде структуры состояния CGameTextInputState.extern "C"JNIEXPORT void JNICALL Java_com_gametextinput_testbed_MainActivity_setInputConnectionNative( JNIEnv *env, jobject this, jobject inputConnection) { GameTextInput_setInputConnection(gameTextInput, inputConnection); GameTextInput_setEventCallback(gameTextInput,[](void *ctx, const GameTexgtInputState *state) { if (!env || !state) return; // process the newly arrived text input from user. __android_log_print(ANDROID_LOG_INFO, "TheGreateGameTextInput", state->text_UTF8); }, env); }В библиотеке C вызовите функцию
GameTextInput_processEvent, которая внутренне вызывает обратный вызов, зарегистрированный на предыдущем шаге, чтобы ваше приложение обрабатывало события при изменении состояния.extern "C" JNIEXPORT void JNICALL Java_com_gametextinput_testbed_InputEnabledTextView_onTextInputEventNative( JNIEnv* env, jobject this, jobject soft_keyboard_event) { GameTextInput_processEvent(gameTextInput, soft_keyboard_event); }
Вспомогательные функции
Библиотека GameTextInput содержит вспомогательные функции, которые позволяют преобразовывать объекты состояния Java в структуры состояния C и наоборот. Функции GameTextInput_showIme и GameTextInput_hideIme позволяют показывать и скрывать IME.
Ссылки
При создании приложений с помощью GameTextInput разработчикам может быть полезна следующая информация:
- Тестовое приложение GameTextInput
- Как использовать GameTextInput с GameActivity
- Справочная документация по GameTextInput
- Исходный код GameTextInput
Отзыв
Если у вас возникли проблемы или вопросы, связанные с GameTextInput, создайте заявку в Google IssueTracker.