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 buforze wewnętrznym 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][google-maven]{:.external}.
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
GameTextInput
do plikubuild.gradle
gry. Pamiętaj, że jeśli Twoje aplikacje korzystają z GameActivity, nie mogą używać samodzielnej bibliotekiGameTextInput
.Upewnij się, że plik
gradle.properties
zawiera 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=true
Zaimportuj pakiet
game-text-input
i dodaj go do celu w plikuCMakeLists.txt
projektu:find_package(game-text-input REQUIRED CONFIG) ... target_link_libraries(... game-text-input::game-text-input)
W jednym z plików
.cpp
w 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.gradle
są prawidłowo skonfigurowane. Jeśli plik#include
nie 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_init
z 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ę
InputEnabledTextView
Java 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
InputEnabledTextView
do układu interfejsu. Na przykład ten kod wactivity_main.xml
moż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ę
InputEnabledTextView
do 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ż
inputConnection
doGameTextInput_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 działania GameTextInput
deweloperom mogą się przydać te informacje:
- Aplikacja testowa GameTextInput
- Korzystanie z GameTextInput w GameActivity
- Dokumentacja 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.