GameTextInput   Należy do Android Game Development Kit.

Korzystanie z biblioteki GameTextInput to prostsza alternatywa niż pisanie aplikacji na Androida w trybie pełnoekranowym, która używa klawiatury ekranowej do wprowadzania tekstu.

GameTextInput udostępnia prosty interfejs API do wyświetlania i ukrywania klawiatury ekranowej, ustawiania lub pobierania tekstu obecnie edytowanego oraz otrzymywania powiadomień o zmianach w tekście. Ta funkcja nie jest przeznaczona do pełnowartościowych edytorów tekstu, ale nadal obsługuje regiony wyboru i komponowania w typowych przypadkach użycia w grach. Biblioteka obsługuje też zaawansowane funkcje edytora metody wprowadzania (IME), takie jak sprawdzanie pisowni, uzupełnianie i znaki wieloklawiszowe.

Wewnętrznie GameTextInput gromadzi tekst wejściowy (wraz z odpowiednimi stanami) w wewnętrznym buforze GameTextInput::currentState_ i powiadamia aplikację o wszelkich zmianach. Następnie aplikacja przetwarza tekst w zarejestrowanej funkcji wywołania zwrotnego.

Dostępność

GameTextInput można używać na te sposoby:

  • W ramach GameActivity: GameActivity integruje GameTextInput. Aplikacje, które korzystają z GameActivity, mogą używać tylko zintegrowanego komponentu GameTextInput. Pełną dokumentację dotyczącą ich używania znajdziesz na stronie GameActivity . Przykład integracji GameActivity i GameTextInput znajdziesz w repertuarze gier-próbek. Ten model użycia wykracza poza zakres tego przewodnika.

  • jako samodzielna biblioteka: dalsza część przewodnika opisuje sposób korzystania z niej.

Te 2 metody są wzajemnie wykluczające się.

Formalne wersje GameTextInput są dostępne w bibliotece gier Jetpack w wersji [Google Maven][google-maven]{:.external}.

Konfigurowanie kompilacji

GameTextInput jest rozpowszechniany jako archiwum Androida (AAR). Plik AAR zawiera klasy Java i kod źródłowy C, który implementuje funkcje natywne aplikacji GameTextInput. Musisz uwzględnić te pliki źródłowe w ramach procesu kompilacji za pomocą Prefab, który udostępnia biblioteki natywne i kod źródłowy do projektu CMake lub kompilacji NDK.

  1. Aby dodać zależność biblioteki GameTextInput do pliku build.gradle gry, postępuj zgodnie z instrukcjami na stronie Jetpack Android Games. Pamiętaj, że jeśli Twoje aplikacje używają klasy GameActivity, nie mogą korzystać z osobnej 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 celu w pliku CMakeLists.txt projektu:

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

    #include <game-text-input/gametextinput.cpp>
    
  5. W plikach źródłowych, które korzystają z interfejsu API GameTextInput C, dołącz 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 plik #include nie został znaleziony, sprawdź plik konfiguracji CMakeLists.txt.

Integracja kompilacji

  1. Z wątku C, który jest już połączony z JVM, lub z głównego wątku aplikacji wywołaj funkcję GameTextInput_initJNIEnv.

    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 kod activity_main.xml może umieścić baner 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 nową klasę InputEnabledTextView do swojej aktywności w języku Java. Jest to stosunkowo proste, gdy używasz powiązania widoku:

    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ż inputConnection do GameTextInput_setInputConnection. Przekaż funkcję wywołania zwrotnego w GameTextInput_setEventCallback, aby otrzymywać powiadomienia o zdarzeniach w postaci struktury stanu 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. W bibliotece C wywołaj funkcję GameTextInput_processEvent, która wewnętrznie wywołuje funkcję wywołania zwrotnego zarejestrowaną w poprzednim kroku, aby Twoja aplikacja mogła obsługiwać zdarzenia podczas 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 pomocnicze, które umożliwiają konwersję między obiektami stanu Java a strukturami stanu C. Dostęp do funkcji wyświetlania i ukrywania IME za pomocą funkcji GameTextInput_showImeGameTextInput_hideIme.

Pliki referencyjne

Deweloperzy mogą znaleźć te informacje przydatne podczas tworzenia aplikacji z użyciem GameTextInput:

Opinia

W przypadku problemów i pytań dotyczących GameTextInput twórz błędy w Google IssueTracker.