Spieltexteingabe Teil des Android Game Development Kit.
Die Verwendung der GameTextInput
-Bibliothek
einfachere Alternative zur Entwicklung einer Vollbild-Android-App mit
Tastatur für die Texteingabe.
GameTextInput
bietet eine einfache API zum Ein- oder Ausblenden der Soft-Property.
können Sie den aktuell bearbeiteten Text einstellen oder abrufen und Benachrichtigungen erhalten, wenn
ändert sich der Text. Diese Funktion ist nicht für
vollständige Texteditor-Apps gedacht,
unterstützt weiterhin die Auswahl und Zusammensetzung von Regionen für typische Anwendungsfälle in
Spiele. Außerdem unterstützt diese Bibliothek den erweiterten Eingabemethodeneditor.
(IME) zu verwenden, wie z. B.
Prüfung, Vervollständigungen und Mehrschlüsselzeichen.
Intern akkumuliert GameTextInput
den Eingabetext (zusammen mit dem
Status) an den internen Puffer GameTextInput::currentState_
an und benachrichtigt
die App auf Änderungen darin hin. Die App führt dann eine Textverarbeitung durch,
registrierte Callback-Funktion.
Verfügbarkeit
GameTextInput
kann so verwendet werden:
Zusammen mit GameActivity: GameActivity integriert GameTextInput. Apps, die GameActivity nutzen, können nur das integrierte GameTextInput festlegen. Die Nutzungsanleitungen sind vollständig dokumentiert auf der GameActivity-Seite . Für eine Beispiel für die Integration von GameActivity und GameTextInput finden Sie in der Repository für Spielebeispiele. Dieses Nutzungsmodell ist nicht in den Rahmen dieses Leitfadens fallen.
Als eigenständige Bibliothek: Im weiteren Verlauf des Leitfadens werden die Nutzungsschritte beschrieben.
Beachten Sie, dass sich die beiden oben genannten Methoden gegenseitig ausschließen.
Formelle GameTextInput
-Releases sind in den folgenden Kanälen verfügbar:
- Veröffentlichung der Jetpack-Spielebibliothek in Google Maven
- Veröffentlichungen von ZIP-Dateien auf der AGDK-Downloadseite
In diesem Leitfaden wird der erste Anwendungsfall behandelt. Um die ZIP-Datei-Releases zu verwenden, finden Sie in der im Paket gelieferten Anleitung.
Build einrichten
GameTextInput
wird als Android Archive (AAR) bereitgestellt. Dieses AAR enthält die Java-Klassen und
Den C-Quellcode, der die nativen Features von GameTextInput
implementiert Ich
diese Quelldateien über
Prefab
,
Dadurch werden native Bibliotheken und Quellcode für Ihr CMake-Projekt oder NDK-Build verfügbar gemacht.
Folgen Sie der Anleitung auf der Jetpack Android Games (Jetpack-Android-Spiele)
GameTextInput
-Bibliotheksabhängigkeit zurbuild.gradle
-Datei deines Spiels. Hinweis Apps, die GameActivity verwenden, können nicht zur Verwendung der eigenständigeGameTextInput
-Bibliothek.gradle.properties
muss die folgenden Zeilen enthalten:# 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
Importieren Sie das Paket
game-text-input
und fügen Sie es Ihrem Ziel in der DateiCMakeLists.txt
des Projekts:find_package(game-text-input REQUIRED CONFIG) ... target_link_libraries(... game-text-input::game-text-input)
Füge in einer der
.cpp
-Dateien in deinem Spiel die folgende Zeile ein, derGameTextInput
-Implementierung:#include <game-text-input/gametextinput.cpp>
Fügen Sie den Header in die Quelldateien ein, die die C API von
GameTextInput
verwenden. Datei:#include <game-text-input/gametextinput.h>
Kompilieren Sie die Anwendung und führen Sie sie aus. Falls CMake-Fehler auftreten, überprüfen Sie den AAE und Die
build.gradle
-Dateien sind korrekt eingerichtet. Wenn die Datei#include
nicht gefunden, überprüfen Sie IhreCMakeLists.txt
-Konfigurationsdatei.
Build einbinden
Aus Ihrem C-Thread, der bereits an die JVM angehängt ist, oder aus dem Hauptthread der Anwendung Thread,
GameTextInput_init
aufrufen mit dem ZeigerJNIEnv
.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); ... }
Erstellen Sie eine
InputEnabledTextView
-Java-Klasse mit Zugriff aufInputConnection
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); }
Fügen Sie dem UI-Layout den erstellten
InputEnabledTextView
hinzu. Beispiel: Der Parameter können Sie mit dem folgenden Code inactivity_main.xml
es am Ende der Bildschirm:<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" />
Rufen Sie diese neue
InputEnabledTextView
-Klasse aus Ihrer Java-Aktivität ab. Dies ist relativ einfach, wenn Sie View Binding verwenden: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); }
Übergeben Sie in Ihrer C-Bibliothek
inputConnection
anGameTextInput_setInputConnection
Callback sendenGameTextInput_setEventCallback
um über Ereignisse als C-State-StructGameTextInputState
benachrichtigt zu werden.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); }
Rufen Sie in Ihrer C-Bibliothek
GameTextInput_processEvent
, die intern den im vorherigen Schritt registrierten Callback aufruft, für um Ereignisse zu verarbeiten, die sich der Status ändert.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); }
Dienstprogrammfunktionen
Die Bibliothek GameTextInput
enthält Dienstprogrammfunktionen, mit denen Sie
zwischen Java State Objects und C State Structs. Zugriff auf Funktionen zum Anzeigen
und den IME über die GameTextInput_showIme
ausblenden,
und GameTextInput_hideIme
Funktionen.
Referenzen
Für Entwickler kann Folgendes hilfreich sein, wenn sie Apps mit
GameTextInput
:
- GameTextInput-Test-App
- GameTextInput mit GameActivity verwenden
- Referenzdokument für GameTextInput
- GameTextInput-Quellcode
Feedback
Bei Problemen oder Fragen für GameTextInput
erstellen Sie
Fehler im Google IssueTracker an.