GameTextInput Część Android Game Development Kit.
Korzystanie z biblioteki GameTextInput jest prostszą alternatywą dla pisania aplikacji na Androida na pełnym ekranie, która używa klawiatury ekranowej do wprowadzania tekstu.
GameTextInput udostępnia prosty interfejs API do wyświetlania lub ukrywania klawiatury ekranowej, ustawiania lub pobierania aktualnie edytowanego tekstu oraz otrzymywania powiadomień o zmianach w tekście. Nie jest to pełnoprawna aplikacja do edycji tekstu, ale zapewnia obsługę regionu wyboru i komponowania w typowych przypadkach użycia w grach. Ta biblioteka obsługuje też zaawansowane funkcje edytora metody wprowadzania (IME), takie jak sprawdzanie pisowni, uzupełnianie i znaki wieloklawiszowe.
Wewnętrznie funkcja GameTextInput gromadzi tekst wejściowy (wraz z odpowiednimi stanami) w wewnętrznym buforze GameTextInput::currentState_ i powiadamia aplikację o wszelkich zmianach w nim. Aplikacja przetwarza tekst w zarejestrowanej funkcji wywołania zwrotnego.
Dostępność
GameTextInput można używać w ten sposób:
Wraz z GameActivity: GameActivity integruje GameTextInput. Aplikacje korzystające z GameActivity mogą używać tylko zintegrowanego interfejsu GameTextInput. Instrukcje użytkowania są w pełni udokumentowane na stronie GameActivity . Przykłady integracji GameActivity i GameTextInput znajdziesz w repozytorium games-samples. Ten model użycia nie jest objęty zakresem tego przewodnika.
Jako samodzielna biblioteka: pozostała część przewodnika zawiera opis kroków użycia.
Pamiętaj, że te 2 metody wzajemnie się wykluczają.
Oficjalne wersje GameTextInput są dostępne w bibliotece gier Jetpack w Google Maven.
Konfigurowanie kompilacji
GameTextInput jest rozpowszechniany jako archiwum Androida (AAR). Ten plik AAR zawiera klasy Java i kod źródłowy w języku C, który implementuje funkcje natywne GameTextInput. Musisz uwzględnić te pliki źródłowe w procesie kompilacji za pomocą Prefab, które udostępnia biblioteki natywne i kod źródłowy w projekcie CMake lub kompilacji NDK.
Postępuj zgodnie z instrukcjami na stronie Jetpack Android Games, aby dodać zależność biblioteki
GameTextInputdo plikubuild.gradlegry. Pamiętaj, że jeśli Twoje aplikacje korzystają z GameActivity, nie mogą używać samodzielnej bibliotekiGameTextInput.Upewnij się, że plik
gradle.propertieszawiera te wiersze:# 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=trueZaimportuj pakiet
game-text-inputi dodaj go do celu w plikuCMakeLists.txtprojektu:find_package(game-text-input REQUIRED CONFIG) ... target_link_libraries(... game-text-input::game-text-input)W jednym z plików
.cppw grze dodaj ten wiersz, aby uwzględnić implementacjęGameTextInput:#include <game-text-input/gametextinput.cpp>W plikach źródłowych, które korzystają z interfejsu API C
GameTextInput, uwzględnij plik nagłówkowy:#include <game-text-input/gametextinput.h>Skompiluj i uruchom aplikację. Jeśli wystąpią błędy CMake, sprawdź, czy pliki AAR i
build.gradlesą prawidłowo skonfigurowane. Jeśli plik#includenie zostanie znaleziony, sprawdź plik konfiguracjiCMakeLists.txt.
Integracja kompilacji
Z wątku C, który jest już dołączony do JVM, lub z głównego wątku aplikacji wywołaj funkcję
GameTextInput_initz wskaźnikiemJNIEnv.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); ... }Utwórz klasę
InputEnabledTextViewJava z dostępem doInputConnection.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); }Dodaj utworzony
InputEnabledTextViewdo układu interfejsu. Na przykład ten kod wactivity_main.xmlmoże umieścić go u dołu ekranu:<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" />Pobierz tę nową klasę
InputEnabledTextViewdo aktywności w Javie. Jest to stosunkowo proste, gdy używasz powiązania widoków: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); }W bibliotece C przekaż
inputConnectiondoGameTextInput_setInputConnection. Przekaż wywołanie zwrotne wGameTextInput_setEventCallback, aby otrzymywać powiadomienia o zdarzeniach w postaci struktury stanu CGameTextInputState.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); }W bibliotece C wywołaj funkcję
GameTextInput_processEvent, która wewnętrznie wywołuje zarejestrowaną w poprzednim kroku funkcję zwrotną, aby aplikacja mogła obsługiwać zdarzenia, gdy stan się zmieni.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); }
Funkcje narzędziowe
Biblioteka GameTextInput zawiera funkcje narzędziowe, które umożliwiają konwertowanie obiektów stanu Java na struktury stanu C i odwrotnie. Dostęp do funkcji wyświetlania i ukrywania IME za pomocą funkcji GameTextInput_showIme i GameTextInput_hideIme.
Pliki referencyjne
Podczas tworzenia aplikacji z użyciem GameTextInput deweloperom mogą się przydać te informacje:
- Aplikacja testowa GameTextInput
- Korzystanie z GameTextInput w GameActivity
- Dokumentacja referencyjna GameTextInput
- Kod źródłowy GameTextInput
Opinia
W przypadku problemów i pytań dotyczących GameTextInput utwórz zgłoszenie błędu w Google IssueTracker.