GameTextInput Parte del Android Game Development Kit.

L'utilizzo della libreria GameTextInput è un'alternativa più semplice alla scrittura di un'app per Android a schermo intero che utilizzi la tastiera software per l'inserimento del testo.

GameTextInput fornisce un'API semplice per mostrare o nascondere la tastiera software, impostare o ricevere il testo attualmente modificato e ricevere notifiche quando il testo viene modificato. Questo non è concepito per app di editor di testo complete, ma fornisce comunque supporto per selezione e composizione delle regioni per i casi d'uso tipici nei giochi. Inoltre, questa libreria supporta funzionalità avanzate dell'editor dei metodi di input (IME), come il controllo ortografico, i completamenti e i caratteri multichiave.

Internamente, GameTextInput accumula il testo di input (insieme agli stati pertinenti) nel buffer interno GameTextInput::currentState_ e notifica all'app eventuali modifiche al suo interno. L'app esegue quindi l'elaborazione del testo nella funzione di callback registrata.

Disponibilità

GameTextInput può essere utilizzato nei seguenti modi:

  • Con GameActivity: GameActivity integra GameTextInput. Le applicazioni che usano GameActivity possono usare solo la versione integrata GameTextInput. Le istruzioni per l'utilizzo sono completamente documentate nella pagina GameActivity . Per un esempio dell'integrazione di GameActivity e GameTextInput, consulta il repository dei giochi-samples. Questo modello di utilizzo non rientra nell'ambito di questa guida.

  • Come libreria autonoma: il resto della guida descrive i passaggi per l'utilizzo.

Tieni presente che i due metodi precedenti si escludono a vicenda.

Le release formali per GameTextInput sono disponibili nei seguenti canali:

Questa guida riguarda il primo caso d'uso. Per utilizzare le release del file ZIP, consulta le istruzioni incluse nella confezione.

Configura la build

GameTextInput viene distribuito come Archivio Android (AAR). Questo AAR contiene le classi Java e il codice sorgente C, che implementa le caratteristiche native di GameTextInput. Devi includere questi file di origine nel processo di compilazione tramite Prefab, che espone le librerie native e il codice sorgente al tuo progetto CMake o alla build NDK.

  1. Segui le istruzioni nella pagina Giochi Android Jetpack per aggiungere la dipendenza della libreria GameTextInput al file build.gradle del tuo gioco. Tieni presente che se le tue applicazioni usano GameActivity, non possono usare la libreria GameTextInput autonoma.

  2. Assicurati che gradle.properties contenga le righe seguenti:

    # 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. Importa il pacchetto game-text-input e aggiungilo alla destinazione nel file CMakeLists.txt del tuo progetto:

    find_package(game-text-input REQUIRED CONFIG)
    ...
    target_link_libraries(... game-text-input::game-text-input)
    
  4. In uno dei file .cpp nel gioco, aggiungi la seguente riga per includere l'implementazione GameTextInput:

    #include <game-text-input/gametextinput.cpp>
    
  5. Nei file di origine che utilizzano l'API C GameTextInput, includi il file di intestazione:

    #include <game-text-input/gametextinput.h>
    
  6. Compila ed esegui l'app. Se si verificano errori di tipo CMake, verifica che l'AAR e i file build.gradle siano configurati correttamente. Se il file #include non viene trovato, verifica il file di configurazione CMakeLists.txt.

Integra la tua build

  1. Dal thread C già collegato alla JVM o dal thread principale dell'app, chiama GameTextInput_init con un puntatore 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. Crea una classe Java InputEnabledTextView con accesso a 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. Aggiungi l'elemento InputEnabledTextView creato al layout dell'interfaccia utente. Ad esempio, il seguente codice in activity_main.xml può posizionarlo in fondo allo schermo:

    <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. Recupera questa nuova classe InputEnabledTextView nella tua attività Java. Questo è relativamente semplice quando utilizzi Visualizza associazione:

    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. Nella tua libreria C, passa inputConnection in GameTextInput_setInputConnection. Esegui un callback in GameTextInput_setEventCallback per ricevere una notifica sugli eventi come struct di stato 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. Nella libreria C, chiama GameTextInput_processEvent, che chiama internamente il callback registrato nel passaggio precedente, affinché la tua app possa gestire gli eventi quando lo stato cambia.

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

Funzioni di utilità

La libreria GameTextInput include funzioni di utilità che consentono di convertire tra oggetti di stato Java e struct di stato C. Accedi alla funzionalità per mostrare e nascondere l'IME tramite le funzioni GameTextInput_showIme e GameTextInput_hideIme.

Riferimenti

Gli sviluppatori potrebbero trovare utile quanto segue durante la creazione di app con GameTextInput:

Feedback

Per eventuali problemi e domande relativi a GameTextInput, crea un bug in Google IssueTracker.