TextInput in GameActivity   Parte di Android Game Development Kit.

GameActivity integra GameTextInput:

  • fornendo un wrapper
  • creazione di un flag per la disponibilità di nuovi eventi di input di testo
  • direttamente utilizzando il buffer di stato di GameTextInput per i contenuti di testo

Come mostrato nel seguente diagramma, le applicazioni utilizzano diversi componenti logici interni per l'inserimento di testo da parte dell'utente:

alt_text

Esistono tre passaggi generali per utilizzare la libreria GameTextInput integrata:

  • Controllare la tastiera su schermo nell'interfaccia utente
  • Sapere quando è disponibile un nuovo testo
  • Recuperare il testo inserito dall'utente e i relativi stati

Il resto del documento li descrive in dettaglio. Per un esempio di GameTextInput con GameActivity in azione, consulta il repository games-samples.

Controllare la tastiera su schermo nell'interfaccia utente

GameActivity fornisce due funzioni per controllare la tastiera virtuale nell'interfaccia utente:

Per le definizioni, consulta la documentazione di riferimento dell'API. Dopo la visualizzazione della tastiera, la UI dell'applicazione potrebbe avere un aspetto simile al seguente:

alt_text

Verificare la disponibilità del testo

Gli eventi della tastiera virtuale vengono passati da GameTextInput sul lato Java al lato C/C++ tramite JNI, quindi vengono trasferiti al wrapper di GameActivity, per poi riflettersi nel flag android_app::textInputState implementato in native_app_glue. Le applicazioni devono eseguire il polling di questo flag periodicamente per eseguire l'elaborazione prevista:

  • GameActivity imposta solo il flag android_app::textInputState.
  • Le applicazioni eseguono il polling del flag e gestiscono i nuovi eventi GameTextInput, come il nuovo testo aggiunto al buffer di input.
  • Le app cancellano android_app::textInputState.

Tieni presente che android_app::textInputState non fa distinzione tra eventi di input di testo singolo e multiplo.

Per un esempio semplice, il seguente codice esegue il polling del flag textInputState dopo la gestione dei comandi del ciclo di vita dell'app, degli eventi tocco e degli eventi chiave:

while (true) {
   // Read all pending events.
   int events;
   struct android_poll_source* source;

   while ((ALooper_pollOnce(engine.animating ? 0 : -1, nullptr, &events,
                                 (void**)&source)) >= 0) {
       // Process this event, etc.
       ...
       // Check if we are exiting.
       if (app->destroyRequested != 0) {
           engine_term_display(&engine);
           return;
       }
   }
   engine_handle_input(app);

   // Process text input events if there is any outstanding.
   if (app->textInputState) {
       // process TextInput events.
          ...
       //reset the textInputState flag
       app->textInputState = 0;
   }
   if (engine.animating) {
         // draw frames.
   }
}

Recuperare il testo inserito dall'utente

I testi di input e altri stati vengono accumulati nel buffer interno di GameTextInput, GameTextInput::currentState_. Le applicazioni possono utilizzare uno dei seguenti modi per recuperare i contenuti:

  • API wrapper di GameActivity (consigliata)
  • API GameTextInput

Ottenere lo stato di TextInput con l'API GameActivity

Le applicazioni acquisiscono l'input di testo corrente con il tipico meccanismo di callback:

Continuando con lo snippet della sezione precedente, il seguente codice acquisisce un riferimento al buffer di input di testo, lo elabora (non mostrato) e reimposta il flag dell'evento:

extern "C" void GameTextInputGetStateCB(void *ctx, const struct GameTextInputState *state) {
    auto* engine = (struct engine*)ctx;
    if (!engine || !state) return;

    // Process the text event(s).
    LOGI("UserInputText: %s", state->text_UTF8);

    // Clear the text input flag.
    engine->app->textInputState = 0;
}

Nel ciclo di gioco mostrato nella sezione precedente, controlla ed elabora il testo con il gestore di input di testo riportato sopra:

if (state->textInputState) {
    GameActivity_getTextInputState(
        app->activity,
        GameTextInputGetStateCB,  // App's event handler shown above.
        &engine // Context to the GameTextInputGetStateCB function.
    );
}

Le applicazioni possono inizializzare facoltativamente i contenuti GameTextInputState con GameActivity_setTextInputState().

Ottenere lo stato di TextInput con l'API GameTextInput

Le applicazioni possono anche utilizzare direttamente l'API GameTextInput per recuperare l'GameTextInputState attuale:

Ancora una volta, tieni presente che le applicazioni non devono inizializzare GameTextInput direttamente; GameActivity lo fa già durante la procedura di inizializzazione.

Il meccanismo di callback è lo stesso utilizzato dalla funzione GameActivity_getTextInputState() di GameActivity.

Riferimenti

Gli sviluppatori potrebbero trovare utili le seguenti risorse per la creazione di applicazioni GameActivity:

Feedback

GameActivity e GameTextInput fanno parte della libreria di giochi Jetpack. Per eventuali problemi e domande, crea un bug su Google IssueTracker.