GameTextInput Część pakietu Android Game Development Kit.

Biblioteka GameTextInput to prostsza alternatywa dla pisania pełnoekranowej aplikacji na Androida, która do wprowadzania tekstu korzysta z klawiatury programowej.

GameTextInput ma prosty interfejs API, który umożliwia wyświetlanie i ukrywanie klawiatury programowej, ustawianie lub odbieranie aktualnie edytowanego tekstu oraz otrzymywanie powiadomień o zmienionych tekstach. Nie jest ona przeznaczona dla w pełni funkcjonalnych aplikacji do edycji tekstu, ale zapewnia obsługę wyboru i tworzenia regionu w typowych przypadkach użycia w grach. Ta biblioteka obsługuje również zaawansowane funkcje edytora metod wprowadzania, takie jak sprawdzanie pisowni, uzupełnienia i znaki z wieloma kluczami.

GameTextInput gromadzi tekst wejściowy (wraz z odpowiednimi stanami) w wewnętrznym buforze GameTextInput::currentState_ i powiadamia aplikację o wszelkich zmianach. Aplikacja przetwarza tekst za pomocą zarejestrowanej funkcji wywołania zwrotnego.

Dostępność

GameTextInput mogą być używane na następujące sposoby:

  • Wspólnie z platformą GameActivity: GameActivity integruje funkcję GameTextInput. Aplikacje, które używają GameActivity, mogą korzystać tylko ze zintegrowanego interfejsu GameTextInput. Instrukcje dotyczące użytkowania są dokładnie udokumentowane na stronie GameActivity . Przykład integracji usług GameActivity i GameTextInput znajdziesz w repozytorium Games-samples. Ten model użytkowania nie należy do zakresu tego przewodnika.

  • Jako samodzielna biblioteka – w dalszej części przewodnika znajdziesz opis czynności związanych z korzystaniem z aplikacji.

Pamiętaj, że powyższe dwie metody wzajemnie się wykluczają.

Formalne premiery GameTextInput są dostępne na tych kanałach:

Ten przewodnik dotyczy pierwszego przypadku użycia. Zwalnianie każdego pliku ZIP można znaleźć w instrukcjach dołączonych do opakowania.

Konfigurowanie kompilacji

Aplikacja GameTextInput jest rozpowszechniana jako archiwum Androida (AAR). To AAR zawiera klasy Java i kod źródłowy C, który implementuje natywne funkcje usługi GameTextInput. Musisz uwzględnić te pliki źródłowe w ramach procesu kompilacji w Prefab, co spowoduje udostępnienie bibliotek natywnych i kodu źródłowego w projekcie CMake lub kompilacji NDK.

  1. Postępuj zgodnie z instrukcjami na stronie Gry Jetpack na Androida, aby dodać zależność biblioteki GameTextInput do pliku build.gradle gry. Pamiętaj, że jeśli Twoje aplikacje używają GameActivity, nie mogą używać samodzielnej biblioteki GameTextInput.

  2. Upewnij się, że gradle.properties zawiera te wiersze:

    # 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. Zaimportuj pakiet game-text-input i dodaj go do miejsca docelowego w pliku CMakeLists.txt projektu:

    find_package(game-text-input REQUIRED CONFIG)
    ...
    target_link_libraries(... game-text-input::game-text-input)
    
  4. W jednym z plików .cpp w grze dodaj ten wiersz, aby uwzględnić implementację GameTextInput:

    #include <game-text-input/gametextinput.cpp>
    
  5. W plikach źródłowych korzystających z interfejsu GameTextInput C API uwzględnij plik nagłówka:

    #include <game-text-input/gametextinput.h>
    
  6. Skompiluj i uruchom aplikację. Jeśli wystąpią błędy CMake, sprawdź, czy pliki AAR i build.gradle są prawidłowo skonfigurowane. Jeśli nie możesz znaleźć pliku #include, sprawdź plik konfiguracji CMakeLists.txt.

Zintegruj swoją kompilację

  1. Z wątku C, który jest już dołączony do JVM, lub z głównego wątku aplikacji, wywołaj metodę GameTextInput_init ze wskaźnikiem 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. Utwórz klasę Java InputEnabledTextView z dostępem do 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. Dodaj utworzony element InputEnabledTextView do układu interfejsu. Na przykład ten kod w funkcji activity_main.xml może umieścić go u dołu ekranu:

    <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. Pobierz tę nową klasę InputEnabledTextView do aktywności w Javie. Gdy używasz powiązania widoku danych, jest to stosunkowo proste:

    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. W bibliotece C przekaż kod inputConnection do zajęć GameTextInput_setInputConnection. Przekaż wywołanie zwrotne w komponencie GameTextInput_setEventCallback, aby otrzymać powiadomienie o zdarzeniach w formie struct GameTextInputState stanu C.

    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. W bibliotece C wywołaj metodę GameTextInput_processEvent, która wewnętrznie wywoła wywołanie zwrotne zarejestrowane w poprzednim kroku, aby aplikacja obsługiwała zdarzenia w przypadku zmiany stanu.

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

Funkcje użytkowe

Biblioteka GameTextInput zawiera funkcje narzędziowe, które umożliwiają konwertowanie obiektów stanu Java i struktur stanu C. uzyskać dostęp do funkcji wyświetlania i ukrywania IME za pomocą funkcji GameTextInput_showIme i GameTextInput_hideIme.

Pliki referencyjne

Poniższe informacje mogą być przydatne dla deweloperów podczas tworzenia aplikacji za pomocą GameTextInput:

Opinia

W przypadku problemów i pytań związanych z usługą GameTextInput utwórz błąd w narzędziu Google IssueTracker.