Spieltexteingabe Teil des Android Game Development Kit.

Die Verwendung der GameTextInput-Bibliothek einfachere Alternative zur Entwicklung einer Vollbild-Android-App mit Tastatur für die Texteingabe.

GameTextInput bietet eine einfache API zum Ein- oder Ausblenden der Soft-Property. können Sie den aktuell bearbeiteten Text einstellen oder abrufen und Benachrichtigungen erhalten, wenn ändert sich der Text. Diese Funktion ist nicht für vollständige Texteditor-Apps gedacht, unterstützt weiterhin die Auswahl und Zusammensetzung von Regionen für typische Anwendungsfälle in Spiele. Außerdem unterstützt diese Bibliothek den erweiterten Eingabemethodeneditor. (IME) zu verwenden, wie z. B. Prüfung, Vervollständigungen und Mehrschlüsselzeichen.

Intern akkumuliert GameTextInput den Eingabetext (zusammen mit dem Status) an den internen Puffer GameTextInput::currentState_ an und benachrichtigt die App auf Änderungen darin hin. Die App führt dann eine Textverarbeitung durch, registrierte Callback-Funktion.

Verfügbarkeit

GameTextInput kann so verwendet werden:

  • Zusammen mit GameActivity: GameActivity integriert GameTextInput. Apps, die GameActivity nutzen, können nur das integrierte GameTextInput festlegen. Die Nutzungsanleitungen sind vollständig dokumentiert auf der GameActivity-Seite . Für eine Beispiel für die Integration von GameActivity und GameTextInput finden Sie in der Repository für Spielebeispiele. Dieses Nutzungsmodell ist nicht in den Rahmen dieses Leitfadens fallen.

  • Als eigenständige Bibliothek: Im weiteren Verlauf des Leitfadens werden die Nutzungsschritte beschrieben.

Beachten Sie, dass sich die beiden oben genannten Methoden gegenseitig ausschließen.

Formelle GameTextInput-Releases sind in den folgenden Kanälen verfügbar:

In diesem Leitfaden wird der erste Anwendungsfall behandelt. Um die ZIP-Datei-Releases zu verwenden, finden Sie in der im Paket gelieferten Anleitung.

Build einrichten

GameTextInput wird als Android Archive (AAR) bereitgestellt. Dieses AAR enthält die Java-Klassen und Den C-Quellcode, der die nativen Features von GameTextInput implementiert Ich diese Quelldateien über Prefab, Dadurch werden native Bibliotheken und Quellcode für Ihr CMake-Projekt oder NDK-Build verfügbar gemacht.

  1. Folgen Sie der Anleitung auf der Jetpack Android Games (Jetpack-Android-Spiele) GameTextInput-Bibliotheksabhängigkeit zur build.gradle-Datei deines Spiels. Hinweis Apps, die GameActivity verwenden, können nicht zur Verwendung der eigenständige GameTextInput-Bibliothek.

  2. gradle.properties muss die folgenden Zeilen enthalten:

    # 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. Importieren Sie das Paket game-text-input und fügen Sie es Ihrem Ziel in der Datei CMakeLists.txt des Projekts:

    find_package(game-text-input REQUIRED CONFIG)
    ...
    target_link_libraries(... game-text-input::game-text-input)
    
  4. Füge in einer der .cpp-Dateien in deinem Spiel die folgende Zeile ein, der GameTextInput-Implementierung:

    #include <game-text-input/gametextinput.cpp>
    
  5. Fügen Sie den Header in die Quelldateien ein, die die C API von GameTextInput verwenden. Datei:

    #include <game-text-input/gametextinput.h>
    
  6. Kompilieren Sie die Anwendung und führen Sie sie aus. Falls CMake-Fehler auftreten, überprüfen Sie den AAE und Die build.gradle-Dateien sind korrekt eingerichtet. Wenn die Datei #include nicht gefunden, überprüfen Sie Ihre CMakeLists.txt-Konfigurationsdatei.

Build einbinden

  1. Aus Ihrem C-Thread, der bereits an die JVM angehängt ist, oder aus dem Hauptthread der Anwendung Thread, GameTextInput_init aufrufen mit dem Zeiger 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. Erstellen Sie eine InputEnabledTextView-Java-Klasse mit Zugriff auf 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. Fügen Sie dem UI-Layout den erstellten InputEnabledTextView hinzu. Beispiel: Der Parameter können Sie mit dem folgenden Code in activity_main.xml es am Ende der Bildschirm:

    <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. Rufen Sie diese neue InputEnabledTextView-Klasse aus Ihrer Java-Aktivität ab. Dies ist relativ einfach, wenn Sie View Binding verwenden:

    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. Übergeben Sie in Ihrer C-Bibliothek inputConnection an GameTextInput_setInputConnection Callback senden GameTextInput_setEventCallback um über Ereignisse als C-State-Struct GameTextInputState benachrichtigt zu werden.

    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. Rufen Sie in Ihrer C-Bibliothek GameTextInput_processEvent , die intern den im vorherigen Schritt registrierten Callback aufruft, für um Ereignisse zu verarbeiten, die sich der Status ändert.

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

Dienstprogrammfunktionen

Die Bibliothek GameTextInput enthält Dienstprogrammfunktionen, mit denen Sie zwischen Java State Objects und C State Structs. Zugriff auf Funktionen zum Anzeigen und den IME über die GameTextInput_showIme ausblenden, und GameTextInput_hideIme Funktionen.

Referenzen

Für Entwickler kann Folgendes hilfreich sein, wenn sie Apps mit GameTextInput:

Feedback

Bei Problemen oder Fragen für GameTextInput erstellen Sie Fehler im Google IssueTracker an.