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

Parametr GameActivity integruje funkcję GameTextInput przez:

  • dostarczam kod
  • utworzenie flagi dostępności nowego zdarzenia wprowadzania tekstu.
  • bezpośrednio za pomocą bufora stanu GameTextInput dla treści tekstowej

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

tekst_alternatywny

Z wbudowanej biblioteki GameTextInput można korzystać w 3 ogólnych krokach:

  • Sterowanie klawiaturą programową w interfejsie
  • Otrzymuję informację o dostępności nowego tekstu
  • Pobieranie wpisanego przez użytkownika tekstu i jego stanów

W pozostałej części tego dokumentu znajdziesz szczegółowe informacje na ten temat. Przykład użycia GameTextInput z elementem GameActivity w działaniu znajdziesz w repozytorium gier-przykładów.

Steruj klawiaturą programową w interfejsie

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

Ich definicje znajdziesz w dokumentacji API. Po wyświetleniu klawiatury interfejs aplikacji może wyglądać tak:

tekst_alternatywny

Sprawdź dostępność tekstu

Zdarzenia klawiatury programowej są przekazywane z GameTextInput po stronie Javy do strony C/C++ przez interfejs JNI, a następnie do otoki GameActivity, co odzwierciedla flagę android_app::textInputState zaimplementowaną w native_app_glue. Aplikacje powinny okresowo sondować tę flagę, aby wykonać zamierzone przetwarzanie:

  • GameActivity ustawia tylko flagę android_app::textInputState.
  • Aplikacje odpytują i obsługują nowe zdarzenia GameTextInput, na przykład nowy tekst dodany do bufora danych wejściowych.
  • Aplikacje usuwają android_app::textInputState.

Pamiętaj, że android_app::textInputState nie rozróżnia pojedynczych zdarzeń wprowadzania tekstu ani ich większej liczby.

Na przykład ten kod odpytuje flagę textInputState po obsłudze poleceń cyklu aplikacji, zdarzeń dotknięcia i kluczowych zdarzeń:

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

   while ((ALooper_pollAll(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 wpisanego tekstu użytkownika

Teksty wejściowe i inne stany są gromadzone w wewnętrznym buforze GameTextInput GameTextInput::currentState_. Zawartość aplikacji pobiera się na jeden z tych sposobów:

  • Opakowujący interfejs API GameActivity (zalecany)
  • Interfejs API GameTextInput

Pobieranie stanu TextInput za pomocą interfejsu GameActivity API

Aplikacje pobierają bieżące dane tekstowe za pomocą typowego mechanizmu wywołania zwrotnego:

  • Zaimplementuj funkcję wywołania zwrotnego typu GameTextInputGetStateCallback do przetwarzania zdarzeń wprowadzania tekstu.
  • Wywołaj GameActivity_getInputState(), gdy istnieje co najmniej jedno oczekujące zdarzenie.
  • Po przetworzeniu zdarzeń wyczyść android_app::textInputState.

Kontynuując fragment kodu z poprzedniej sekcji, następujący kod uzyskuje odniesienie do bufora danych wejściowych tekstowych, przetwarza go (nie jest widoczny) 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ą podanego wyżej modułu do 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 inicjować zawartość GameTextInputState za pomocą GameActivity_setTextInputState().

Pobieranie stanu TextInput za pomocą interfejsu GameTextInput API

Aplikacje mogą też pobierać bieżące dane GameTextInputState za pomocą interfejsu API GameTextInput:

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

Mechanizm wywołania zwrotnego jest taki sam jak używany przez funkcję GameActivity_getTextInputState() GameActivity.

Pliki referencyjne

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

Opinia

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