GameTextInput Parte do Android Game Development Kit.
Usar a biblioteca GameTextInput
é uma
alternativa mais simples na criação de um app Android em tela cheia que usa o teclado
de software para entrada de texto.
A GameTextInput
fornece uma API simples para mostrar ou ocultar o teclado de
software, definir ou receber o texto editado no momento e receber notificações quando
o texto for modificado. Ela não é destinada a apps completos de editor de texto, mas
ainda oferece compatibilidade regional para seleção e composição em casos de uso típicos em
jogos. Essa biblioteca também é compatível com recursos avançados de Editor de método de entrada
(IME, na sigla em inglês), como verificação
ortográfica, conclusões e caracteres de várias teclas.
Internamente, GameTextInput
acumula o texto de entrada (junto com os
estados relevantes) no buffer interno GameTextInput::currentState_
e notifica
o app sobre qualquer mudança nele. Em seguida, o app executa o processamento de texto na
função de callback registrada.
Disponibilidade
O GameTextInput
pode ser usado das seguintes maneiras:
Com a GameActivity: a GameActivity integra a GameTextInput. Os aplicativos que usam a GameActivity só podem usar a GameTextInput integrada. As instruções de uso estão totalmente documentadas na página da GameActivity . Para conferir um exemplo de integração da GameActivity e da GameTextInput, consulte o repositório games-samples. Este modelo de uso não está no escopo deste guia.
Como uma biblioteca independente: o restante do guia descreve as etapas de uso.
Os dois métodos acima são mutuamente exclusivos.
As versões formais do GameTextInput
estão disponíveis na versão da biblioteca de jogos do Jetpack
no [Google Maven][google-maven]{:.external}.
Configurar o build
A GameTextInput
é distribuída como um ARchive do Android (AAR). Esse AAR contém as classes Java e
o código-fonte C, que implementa os recursos nativos da GameTextInput
. É
necessário incluir esses arquivos de origem como parte do processo de build usando
Prefab
,
que expõe bibliotecas nativas e código-fonte ao seu Projeto CMake ou Build do NDK.
Siga as instruções na página Jetpack Android Games para adicionar a dependência da biblioteca
GameTextInput
ao arquivobuild.gradle
do jogo. Observe que, se os aplicativos estiverem usando a GameActivity, eles não poderão usar a bibliotecaGameTextInput
independente.Verifique se
gradle.properties
contém as seguintes linhas:# 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
Importe o pacote
game-text-input
e adicione-o ao destino no arquivoCMakeLists.txt
do projeto:find_package(game-text-input REQUIRED CONFIG) ... target_link_libraries(... game-text-input::game-text-input)
Em um dos arquivos
.cpp
no jogo, adicione a seguinte linha para incluir a implementação deGameTextInput
:#include <game-text-input/gametextinput.cpp>
Nos arquivos de origem que usam a API C
GameTextInput
, inclua o arquivo principal:#include <game-text-input/gametextinput.h>
Compile e execute o aplicativo. Em caso de erros do CMake, verifique se o AAR e os arquivos
build.gradle
estão configurados corretamente. Se o arquivo#include
não for encontrado, verifique seu arquivo de configuraçãoCMakeLists.txt
.
Integrar o build
Na linha de execução C que já está anexada à JVM ou à linha de execução principal do app, chame
GameTextInput_init
com um ponteiroJNIEnv
.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); ... }
Crie uma classe Java
InputEnabledTextView
com acesso 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); }
Adicione o
InputEnabledTextView
criado ao layout da interface. Por exemplo, o código abaixo emactivity_main.xml
pode posicioná-lo na parte de baixo da tela:<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" />
Extraia essa nova classe
InputEnabledTextView
para sua atividade Java. Isso é relativamente simples quando você usa a Vinculação de visualizações: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); }
Na biblioteca C, transmita
inputConnection
paraGameTextInput_setInputConnection
. Transmita um callback emGameTextInput_setEventCallback
para ser notificado sobre eventos como estrutura 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); }
Na biblioteca C, chame
GameTextInput_processEvent
, que chama internamente o callback registrado na etapa anterior para que o app processe eventos quando o estado mudar.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); }
Funções utilitárias
A biblioteca GameTextInput
inclui funções utilitárias que permitem a conversão
entre objetos de estado Java e estruturas de estado C. Acesse a funcionalidade para mostrar
e ocultar o IME usando as funções
GameTextInput_showIme
e GameTextInput_hideIme
.
Referências
Os desenvolvedores podem achar os seguintes recursos úteis ao criar apps com
GameTextInput
:
- App de teste da GameTextInput
- Usar GameTextInput com GameActivity
- Documento de referência da GameTextInput
- Código-fonte da GameTextInput
Feedback
Em caso de problemas e dúvidas sobre GameTextInput
, crie
um relatório de bug no IssueTracker do Google.