TextInput w GameActivity   Część Android Game Development Kit.

GameActivity integruje GameTextInput w ten sposób:

  • zapewnienie otoki,
  • utworzenie flagi dostępności nowego zdarzenia wprowadzania tekstu,
  • bezpośrednio za pomocą bufora stanu GameTextInput dla treści tekstowej;

Jak widać na poniższym diagramie, aplikacje używają różnych wewnętrznych komponentów logicznych do wprowadzania tekstu przez użytkownika:

alt_text

Korzystanie z wbudowanej biblioteki GameTextInput obejmuje 3 główne kroki:

  • Sterowanie klawiaturą ekranową w interfejsie
  • wiedzieć, kiedy dostępny jest nowy tekst;
  • Pobieranie tekstu wprowadzonego przez użytkownika i jego stanów

Szczegółowo opisujemy je w dalszej części tego dokumentu. Przykład użycia funkcji GameTextInputGameActivity znajdziesz w repozytorium games-samples.

Sterowanie klawiaturą ekranową w interfejsie

GameActivity udostępnia 2 funkcje sterowania klawiaturą ekranową w interfejsie:

Definicje znajdziesz w dokumentacji referencyjnej interfejsu API. Po wyświetleniu klawiatury interfejs aplikacji może wyglądać podobnie do tego:

alt_text

Sprawdzanie dostępności tekstu

Zdarzenia klawiatury ekranowej są przekazywane z GameTextInput po stronie Javy na stronę C/C++ za pomocą JNI, a następnie trafiają do otoki GameActivity, co ostatecznie znajduje odzwierciedlenie we fladze android_app::textInputState zaimplementowanej w native_app_glue. Aplikacje powinny okresowo sprawdzać ten flag, aby wykonać zamierzone przetwarzanie:

  • Interfejs GameActivity ustawia tylko flagę android_app::textInputState.
  • Aplikacje sprawdzają stan flagi i obsługują nowe zdarzenia GameTextInput, takie jak nowy tekst dodany do bufora wejściowego.
  • Aplikacje czyszczą android_app::textInputState.

Pamiętaj, że android_app::textInputState nie rozróżnia pojedynczych i wielokrotnych zdarzeń wprowadzania tekstu.

Prosty przykład: ten kod odpytuje flagę textInputState po obsłużeniu poleceń cyklu aplikacji, zdarzeń dotykowych i zdarzeń klawiatury:

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.
   }
}

Pobieranie tekstu wprowadzonego przez użytkownika

Teksty wejściowe i inne stany są gromadzone w wewnętrznym buforze GameTextInput, GameTextInput::currentState_. Aplikacje mogą pobierać treści na jeden z tych sposobów:

  • API otoki GameActivity (zalecane)
  • GameTextInput API

Pobieranie stanu TextInput za pomocą interfejsu GameActivity API

Aplikacje uzyskują bieżące dane wejściowe za pomocą typowego mechanizmu wywołania zwrotnego:

  • Zaimplementuj funkcję wywołania zwrotnego typu GameTextInputGetStateCallback, aby przetwarzać zdarzenia wprowadzania tekstu.
  • Wywołaj funkcję GameActivity_getInputState(), gdy występuje co najmniej 1 oczekujące zdarzenie.
  • Wyczyść android_app::textInputState po przetworzeniu zdarzeń.

Kontynuując pracę z fragmentem kodu z poprzedniej sekcji, poniższy kod uzyskuje odniesienie do bufora wprowadzania tekstu, przetwarza go (nie jest to pokazane) i resetuje flagę zdarzenia:

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

W pętli gry pokazanej w poprzedniej sekcji sprawdź i przetwórz tekst za pomocą powyższego modułu obsługi wprowadzania tekstu:

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

Aplikacje mogą opcjonalnie zainicjować treść GameTextInputState za pomocą funkcji GameActivity_setTextInputState().

Pobieranie stanu TextInput za pomocą interfejsu GameTextInput API

Aplikacje mogą też bezpośrednio używać interfejsu GameTextInput API do pobierania bieżącychGameTextInputState:

Pamiętaj, że aplikacje nie powinny inicjować kodu GameTextInput bezpośrednio. GameActivity robi to już podczas procesu inicjowania.

Mechanizm wywołania zwrotnego jest taki sam jak w przypadku funkcji GameActivity_getTextInputState() w klasie GameActivity.

Pliki referencyjne

Podczas tworzenia aplikacji deweloperom mogą się przydać te materiały:GameActivity

Opinia

GameActivity i GameTextInput są częścią biblioteki gier Jetpack. W przypadku problemów i pytań utwórz zgłoszenie błędu w Google IssueTracker.