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:
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:
GameActivity_showSoftInput()
wyświetla klawiaturę programową.GameActivity_hideSoftInput()
ukrywa klawiaturę programową.
Ich definicje znajdziesz w dokumentacji API. Po wyświetleniu klawiatury interfejs aplikacji może wyglądać tak:
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
:
- Użyj
GameActivity_getTextInput()
, aby pobrać wewnętrzną instancjęGameTextInput
GameActivity. - Mając już instancję
GameTextInput
, wywołajGameTextInput_getState()
, aby uzyskać te same treści w usłudzeGameTextInputState
.
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:
- Pierwsze kroki w GameActivity
- Dokumentacja użytkownika GameTextInput
- przykład agdkTunnel
- Dokumentacja referencyjna Jetpacka dla GameActivity
- Dokumentacja referencyjna Jetpacka dla GameTextInput
- Kod źródłowy AGDK
Opinia
GameActivity i GameTextInput są częścią biblioteki gier Jetpack. W przypadku jakichkolwiek problemów i pytań utwórz błąd w Google IssueTracker.