GameTextInput Parte del Game Development Kit di Android.
L'utilizzo della libreria GameTextInput
è un'alternativa più semplice alla scrittura di un'app per Android a schermo intero che utilizzi la tastiera software per l'inserimento di testo.
GameTextInput
offre un'API semplice per mostrare o nascondere la tastiera software, impostare o ricevere il testo attualmente modificato e ricevere notifiche in caso di modifica del testo. Non è pensato per app di editor di testo complete, ma fornisce comunque supporto per la selezione e la composizione delle regioni per i casi d'uso tipici dei giochi. Inoltre, questa libreria supporta funzionalità avanzate dell'editor del metodo di input (IME), come il controllo ortografico, i completamenti e i caratteri multichiave.
Internamente, GameTextInput
accumula il testo di input (insieme agli stati pertinenti) nel buffer interno GameTextInput::currentState_
e avvisa l'app di eventuali modifiche. L'app esegue quindi l'elaborazione del testo nella
funzione di callback registrata.
Disponibilità
GameTextInput
può essere utilizzato nei seguenti modi:
Insieme a GameActivity: GameActivity integra GameTextInput. Le applicazioni che utilizzano GameActivity possono usare solo il GameTextInput integrato. Le istruzioni per l'utilizzo sono complete nella pagina GameActivity . Per un esempio dell'integrazione di GameActivity e GameTextInput, consulta il repository game-samples. Questo modello di utilizzo non rientra nell'ambito di questa guida.
Come libreria autonoma: il resto della guida descrive i passaggi di utilizzo.
Tieni presente che i due metodi precedenti si escludono a vicenda.
Le release formali GameTextInput
sono disponibili nei seguenti canali:
- La release della raccolta di giochi Jetpack in Google Maven
- Versioni di file ZIP nella pagina di download di AGDK
Questa guida si riferisce al primo caso d'uso. Per usare le release del file ZIP, consulta le istruzioni all'interno del pacchetto.
Configura la build
GameTextInput
viene distribuito come archivio Android (AAR). Questo AAR contiene le classi Java e
il codice sorgente C, che implementa le funzionalità native di GameTextInput
. Devi
includere questi file sorgente nel processo di compilazione tramite
Prefab
,
che espone le librerie native e il codice sorgente al tuo progetto CMake o alla build NDK.
Segui le istruzioni nella pagina Giochi Android Jetpack per aggiungere la dipendenza della libreria
GameTextInput
al filebuild.gradle
del tuo gioco. Tieni presente che se le tue applicazioni utilizzano GameActivity, non possono usare la libreriaGameTextInput
autonoma.Assicurati che
gradle.properties
contenga le seguenti righe:# 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
Importa il pacchetto
game-text-input
e aggiungilo alla destinazione nel fileCMakeLists.txt
del progetto:find_package(game-text-input REQUIRED CONFIG) ... target_link_libraries(... game-text-input::game-text-input)
In uno dei file
.cpp
del gioco, aggiungi la seguente riga per includere l'implementazione diGameTextInput
:#include <game-text-input/gametextinput.cpp>
Nei file di origine che utilizzano l'API C
GameTextInput
, includi il file di intestazione:#include <game-text-input/gametextinput.h>
Compila ed esegui l'app. Se sono presenti errori CMake, verifica che l'AAR e i file
build.gradle
siano configurati correttamente. Se il file#include
non viene trovato, verifica il file di configurazioneCMakeLists.txt
.
Integra la tua build
Dal thread C già collegato alla JVM o dal thread principale dell'app, chiama
GameTextInput_init
con un puntatoreJNIEnv
.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); ... }
Crea una classe Java
InputEnabledTextView
con accesso aInputConnection
.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); }
Aggiungi l'elemento
InputEnabledTextView
creato al layout UI. Ad esempio, il seguente codice inactivity_main.xml
può posizionarlo in fondo allo schermo:<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" />
Recupera questa nuova classe
InputEnabledTextView
dalla tua attività Java. Questo è relativamente semplice quando utilizzi Visualizza associazione: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); }
Nella tua libreria C, passa
inputConnection
inGameTextInput_setInputConnection
. Passa un callback inGameTextInput_setEventCallback
per ricevere notifiche sugli eventi come struct dello stato 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); }
Nella tua libreria C, chiama
GameTextInput_processEvent
, che chiama internamente il callback registrato nel passaggio precedente, affinché la tua app possa gestire gli eventi quando lo stato cambia.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); }
Funzioni di utilità
La libreria GameTextInput
include funzioni di utilità che consentono di convertire
gli oggetti di stato Java e gli struct di stato C. Accedi alla funzionalità per mostrare e nascondere l'IME tramite le funzioni GameTextInput_showIme
e GameTextInput_hideIme
.
Riferimenti
Gli sviluppatori potrebbero trovare utile quanto segue durante la creazione di app con GameTextInput
:
- App di prova GameTextInput
- Utilizzare GameTextInput con GameActivity
- Documento di riferimento di GameTextInput
- Codice sorgente GameTextInput
Feedback
Per qualsiasi problema o domanda per GameTextInput
, crea
un bug in Google IssueTracker.