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.

  1. Следуйте инструкциям на странице Jetpack Android Games, чтобы добавить зависимость библиотеки GameTextInput в файл build.gradle игры. Обратите внимание, что если в ваших приложениях используется GameActivity, то они не могут использовать отдельную библиотеку GameTextInput.

  2. Убедитесь, что файл 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
    
  3. Импортируйте пакет game-text-input и добавьте его в цель в файле CMakeLists.txt проекта:

    find_package(game-text-input REQUIRED CONFIG)
    ...
    target_link_libraries(... game-text-input::game-text-input)
    
  4. В один из файлов .cpp в игре добавьте следующую строку, чтобы включить реализацию GameTextInput:

    #include <game-text-input/gametextinput.cpp>
    
  5. В исходных файлах, где используется GameTextInput C API, добавьте заголовочный файл:

    #include <game-text-input/gametextinput.h>
    
  6. Скомпилируйте и запустите приложение. Если возникнут ошибки CMake, проверьте, правильно ли настроены файлы AAR и build.gradle. Если файл #include не найден, проверьте файл конфигурации CMakeLists.txt.

Интеграция сборки

  1. Из потока 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);
        ...
    }
    
  2. Создайте класс 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);
    }
    
  3. Добавьте созданный объект 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" />
    
  4. Получите новый класс 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);
      }
    
  5. В библиотеке C передайте inputConnection в функцию GameTextInput_setInputConnection. Передайте обратный вызов в GameTextInput_setEventCallback, чтобы получать уведомления о событиях в виде структуры состояния C GameTextInputState.

    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);
    }
    
  6. В библиотеке 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, создайте заявку в Google IssueTracker.