GameTextInput Parte de Android Game Development Kit.
El uso de la biblioteca de GameTextInput
es una alternativa más simple a escribir una app para Android en pantalla completa que usa el teclado en pantalla para la entrada de texto.
GameTextInput
proporciona una API sencilla a fin de mostrar u ocultar el teclado en pantalla, establecer o recibir el texto editado actualmente, y recibir notificaciones cuando se cambia el texto. Esto no está diseñado para apps completas de editor de texto; pero, aun así, proporciona compatibilidad con la selección y composición de regiones para casos de uso típicos en juegos. Además, esta biblioteca admite funciones avanzadas del Editor de método de entrada (IME), como la corrección ortográfica, las finalizaciones y los caracteres de varias teclas.
Internamente, GameTextInput
acumula el texto de entrada (junto con los estados relevantes) en el búfer interno GameTextInput::currentState_
y notifica a la app sobre los cambios. Luego, la app realiza el procesamiento de texto en su función de devolución de llamada registrada.
Disponibilidad
GameTextInput
se puede usar de las siguientes maneras:
Junto con GameActivity: GameActivity integra GameTextInput. Las aplicaciones que usan GameActivity solo pueden usar el GameTextInput integrado. Las instrucciones de uso están totalmente documentadas en la página de GameActivity. Si quieres ver un ejemplo de integración de GameActivity y GameTextInput consulta el repositorio de muestras de juegos. Este modelo de uso no está dentro del alcance de esta guía.
Como biblioteca independiente: el resto de la guía describe los pasos de uso.
Ten en cuenta que los dos métodos anteriores son mutuamente excluyentes.
Las versiones formales de GameTextInput
están disponibles en los siguientes canales:
- La versión de la biblioteca de juegos de Jetpack en Google Maven
- Las versiones de archivos zip en la página de descarga de AGDK
En esta guía, se explica el caso de primer uso. Para usar las versiones de archivos zip, consulta las instrucciones que se incluyen en el paquete.
Cómo configurar tu compilación
GameTextInput
se distribuye como un Android ARchive (AAR). Este AAR contiene las clases de Java y el código fuente C, que implementa las características nativas de GameTextInput
. Debes incluir estos archivos fuente como parte del proceso de compilación a través de Prefab
, que expone bibliotecas nativas y código fuente a tu proyecto de CMake o compilación del NDK.
Sigue las instrucciones en la página de juegos de Android para Jetpack para agregar la dependencia de la biblioteca
GameTextInput
al archivobuild.gradle
de tu juego. Ten en cuenta que si tus aplicaciones usan GameActivity, no pueden usar la bibliotecaGameTextInput
independiente.Asegúrate de que
gradle.properties
contenga las siguientes líneas:# 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 el paquete
game-text-input
y agrégalo a tu destino en el archivoCMakeLists.txt
de tu proyecto:find_package(game-text-input REQUIRED CONFIG) ... target_link_libraries(... game-text-input::game-text-input)
En uno de los archivos
.cpp
de tu juego, agrega la siguiente línea para incluir la implementación deGameTextInput
:#include <game-text-input/gametextinput.cpp>
En los archivos de origen que usan la API de
GameTextInput
para C, incluye el archivo del encabezado:#include <game-text-input/gametextinput.h>
Compila y ejecuta la app. Si tienes errores de CMake, verifica que el AAR y los archivos
build.gradle
estén configurados correctamente. Si no se encuentra el archivo#include
, verifica tu archivo de configuraciónCMakeLists.txt
.
Cómo integrar tu compilación
Desde tu subproceso C que ya se adjuntó a JVM o el subproceso principal de la app, llama a
GameTextInput_init
con un punteroJNIEnv
.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 clase
InputEnabledTextView
de Java con acceso 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); }
Agrega el elemento
InputEnabledTextView
creado al diseño de la IU. Por ejemplo, el siguiente código deactivity_main.xml
se puede colocar en la parte inferior de la pantalla:<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 esta nueva clase
InputEnabledTextView
para tu actividad de Java. Esto es relativamente simple cuando usas vinculación de vistas: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); }
En tu biblioteca de C, pasa
inputConnection
aGameTextInput_setInputConnection
. Pasa una devolución de llamada enGameTextInput_setEventCallback
para recibir notificaciones de eventos como estructuras de estado 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); }
En la biblioteca de C, llama a
GameTextInput_processEvent
, que internamente realiza una llamada a la devolución de llamada registrada en el paso anterior para que tu app controle eventos cuando cambie el estado.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); }
Funciones de utilidad
La biblioteca de GameTextInput
incluye funciones de utilidad que te permiten realizar la conversión entre objetos de estado Java y estructuras de estado C. Accede a la funcionalidad con el fin de mostrar y ocultar el IME mediante las funciones GameTextInput_showIme
y GameTextInput_hideIme
.
Referencias
A los desarrolladores puede resultarles útil al cuando crean apps con GameTextInput
:
- App de prueba de GameTextInput
- Usa GameTextInput con GameActivity
- Documento de referencia de GameTextInput
- Código de origen de GameTextInput
Comentarios
Si tienes problemas o preguntas, relacionadas con GameTextInput
, crea un error en la Herramienta de seguimiento de errores de Google.