Input testo di gioco Parte del Android Game Development Kit.

L'utilizzo della libreria GameTextInput è un un'alternativa più semplice alla scrittura di un'app per Android a schermo intero che utilizza tastiera per l'input di testo.

GameTextInput fornisce un'API semplice per mostrare o nascondere tastiera, impostare o ricevere il testo attualmente modificato e ricevere notifiche quando il testo viene modificato. Questa funzionalità non è pensata per app di editor di testo a tutti gli effetti, ma continua a offrire supporto per la selezione e la composizione delle regioni per i casi d'uso tipici giochi. Inoltre, questa libreria supporta un editor dei metodi di immissione avanzato, (IME) come controlli, completamenti e caratteri multichiave.

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

Disponibilità

GameTextInput può essere utilizzato nei seguenti modi:

  • Insieme a GameActivity: GameActivity integra GameTextInput. Le applicazioni che usano GameActivity possono usare soltanto GameTextInput. Le istruzioni per l'uso sono completamente documentate su la pagina Attività di gioco . Per un esempio di integrazione di GameActivity e GameTextInput, consulta Repository di esempi di giochi. Questo modello di utilizzo è 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 di GameTextInput sono disponibili nei seguenti canali:

Questa guida tratta il primo caso di utilizzo. Per usare le release dei file ZIP, consulta le istruzioni fornite all'interno del pacco.

Configura la build

GameTextInput viene distribuito come Archivio Android (AAR). Questo AAR contiene le classi Java il codice sorgente C, che implementa le funzionalità native di GameTextInput. Tu 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 Jetpack Android Games per aggiungere il Dipendenza della raccolta GameTextInput dal file build.gradle del gioco. Nota se le tue applicazioni usano GameActivity, non possono usare il libreria GameTextInput indipendente.

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

    # 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 al target nel tuo file CMakeLists.txt del progetto:

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

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

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

Integra la tua build

  1. Dal thread C già collegato alla JVM o dall'app principale thread, 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 a sullo 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 l'associazione delle viste:

    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 raccolta C, passa inputConnection a GameTextInput_setInputConnection Effettua una richiamata GameTextInput_setEventCallback di ricevere notifiche di 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 tua raccolta C, chiama GameTextInput_processEvent , che chiama internamente il callback registrato nel passaggio precedente, per alla tua app per 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 ti consentono di convertire tra oggetti di stato Java e struct di stato C. Funzionalità di accesso per mostrare e nascondere l'IME tramite la GameTextInput_showIme e GameTextInput_hideIme funzioni.

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 su Google IssueTracker.