GameTextInput Należy do Android Game Development Kit.
Korzystanie z biblioteki GameTextInput
to prostsza alternatywa niż pisanie aplikacji na Androida w trybie pełnoekranowym, która używa klawiatury ekranowej do wprowadzania tekstu.
GameTextInput
udostępnia prosty interfejs API do wyświetlania i ukrywania klawiatury ekranowej, ustawiania lub pobierania tekstu obecnie edytowanego oraz otrzymywania powiadomień o zmianach w tekście. Ta funkcja nie jest przeznaczona do pełnowartościowych edytorów tekstu, ale nadal obsługuje regiony wyboru i komponowania w typowych przypadkach użycia w grach. Biblioteka obsługuje też zaawansowane funkcje edytora metody wprowadzania (IME), takie jak sprawdzanie pisowni, uzupełnianie i znaki wieloklawiszowe.
Wewnętrznie GameTextInput
gromadzi tekst wejściowy (wraz z odpowiednimi stanami) w wewnętrznym buforze GameTextInput::currentState_
i powiadamia aplikację o wszelkich zmianach. Następnie aplikacja przetwarza tekst w zarejestrowanej funkcji wywołania zwrotnego.
Dostępność
GameTextInput
można używać na te sposoby:
W ramach GameActivity: GameActivity integruje GameTextInput. Aplikacje, które korzystają z GameActivity, mogą używać tylko zintegrowanego komponentu GameTextInput. Pełną dokumentację dotyczącą ich używania znajdziesz na stronie GameActivity . Przykład integracji GameActivity i GameTextInput znajdziesz w repertuarze gier-próbek. Ten model użycia wykracza poza zakres tego przewodnika.
jako samodzielna biblioteka: dalsza część przewodnika opisuje sposób korzystania z niej.
Te 2 metody są wzajemnie wykluczające się.
Formalne wersje GameTextInput
są dostępne w bibliotece gier Jetpack w wersji [Google Maven][google-maven]{:.external}.
Konfigurowanie kompilacji
GameTextInput
jest rozpowszechniany jako archiwum Androida (AAR). Plik AAR zawiera klasy Java i kod źródłowy C, który implementuje funkcje natywne aplikacji GameTextInput
. Musisz uwzględnić te pliki źródłowe w ramach procesu kompilacji za pomocą Prefab
, który udostępnia biblioteki natywne i kod źródłowy do projektu CMake lub kompilacji NDK.
Aby dodać zależność biblioteki
GameTextInput
do plikubuild.gradle
gry, postępuj zgodnie z instrukcjami na stronie Jetpack Android Games. Pamiętaj, że jeśli Twoje aplikacje używają klasy GameActivity, nie mogą korzystać z osobnej bibliotekiGameTextInput
.Upewnij się, że
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)
Aby uwzględnić implementację
GameTextInput
, dodaj w jednym z plików.cpp
w grze ten wiersz:#include <game-text-input/gametextinput.cpp>
W plikach źródłowych, które korzystają z interfejsu API
GameTextInput
C, dołącz plik nagłówka:#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 został znaleziony, sprawdź plik konfiguracjiCMakeLists.txt
.
Integracja kompilacji
Z wątku C, który jest już połączony z JVM, lub z głównego wątku aplikacji wywołaj funkcję
GameTextInput_init
JNIEnv
.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ę Java
InputEnabledTextView
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 element
InputEnabledTextView
do układu interfejsu. Na przykład kodactivity_main.xml
może umieścić baner 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 nową klasę
InputEnabledTextView
do swojej aktywności w języku Java. Jest to stosunkowo proste, gdy używasz powiązania widoku: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ż funkcję wywołania zwrotnego 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 funkcję wywołania zwrotnego zarejestrowaną w poprzednim kroku, aby Twoja aplikacja mogła obsługiwać zdarzenia podczas zmiany stanu.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 użytkowe
Biblioteka GameTextInput
zawiera funkcje pomocnicze, które umożliwiają konwersję między obiektami stanu Java a strukturami stanu C. Dostęp do funkcji wyświetlania i ukrywania IME za pomocą funkcji GameTextInput_showIme
i GameTextInput_hideIme
.
Pliki referencyjne
Deweloperzy mogą znaleźć te informacje przydatne podczas tworzenia aplikacji z użyciem GameTextInput
:
- Aplikacja testowa GameTextInput
- Używanie komponentu GameTextInput w komponencie GameActivity
- Dokument referencyjny GameTextInput
- Kod źródłowy GameTextInput
Opinia
W przypadku problemów i pytań dotyczących GameTextInput
twórz błędy w Google IssueTracker.