GameActivity 中的文本输入 隶属于 Android 游戏开发套件。
GameActivity 集成了 GameTextInput,通过
- 提供封装器
- 为新的文本输入事件可用性创建标志
- 直接使用 GameTextInput 的状态缓冲区来存储文本内容
如下图所示,应用使用不同的内部逻辑组件来实现用户文本输入功能
使用内置的 GameTextInput
库主要有三个步骤
- 控制 UI 上的软键盘
- 了解何时有新文本可用
- 检索用户输入的文本及其状态
本文档的其余部分将详细介绍这些步骤。如需了解 GameTextInput
与 GameActivity
配合使用的示例,请参阅 games-samples 代码库。
控制 UI 上的软键盘
GameActivity
提供了两个函数来控制 UI 上的软键盘
GameActivity_showSoftInput()
用于显示软键盘。GameActivity_hideSoftInput()
用于隐藏软键盘。
如需了解其定义,请参阅 API 参考文档。键盘显示后,应用的用户界面可能如下所示
检查文本可用性
软键盘事件从 GameTextInput
的 Java 端通过 JNI 传递到 C/C++ 端,然后传递到 GameActivity 的封装器,最终反映在 android_app::textInputState
标志中,此标志在 native_app_glue
中实现。应用应定期轮询此标志以执行预期的处理
- GameActivity 仅设置
android_app::textInputState
标志。 - 应用轮询该标志并处理新的
GameTextInput
事件,例如添加到输入缓冲区的新文本。 - 应用清除
android_app::textInputState
。
请注意,android_app::textInputState
不区分单个文本输入事件和多个文本输入事件。
举个简单的例子,以下代码在处理应用生命周期命令、触摸事件和按键事件后轮询 textInputState
标志
while (true) {
// Read all pending events.
int events;
struct android_poll_source* source;
while ((ALooper_pollOnce(engine.animating ? 0 : -1, nullptr, &events,
(void**)&source)) >= 0) {
// Process this event, etc.
...
// Check if we are exiting.
if (app->destroyRequested != 0) {
engine_term_display(&engine);
return;
}
}
engine_handle_input(app);
// Process text input events if there is any outstanding.
if (app->textInputState) {
// process TextInput events.
...
//reset the textInputState flag
app->textInputState = 0;
}
if (engine.animating) {
// draw frames.
}
}
检索用户输入文本
输入文本和其他状态累积在 GameTextInput 的内部缓冲区 GameTextInput::currentState_
中。应用可以使用以下任一方法检索其内容
- GameActivity 的封装器 API(推荐)
- GameTextInput API
使用 GameActivity API 获取 TextInput 状态
应用使用典型的回调机制获取当前文本输入
- 实现类型为
GameTextInputGetStateCallback
的回调函数来处理文本输入事件。 - 当有一个或多个未完成事件时,调用
GameActivity_getInputState()
。 - 处理事件后,清除
android_app::textInputState
。
接着上一部分中的代码段,以下代码获取对文本输入缓冲区的引用,对其进行处理(未显示),并重置事件标志
extern "C" void GameTextInputGetStateCB(void *ctx, const struct GameTextInputState *state) {
auto* engine = (struct engine*)ctx;
if (!engine || !state) return;
// Process the text event(s).
LOGI("UserInputText: %s", state->text_UTF8);
// Clear the text input flag.
engine->app->textInputState = 0;
}
在上一部分中显示的游戏循环中,使用上述文本输入处理程序检查和处理文本
if (state->textInputState) {
GameActivity_getTextInputState(
app->activity,
GameTextInputGetStateCB, // App's event handler shown above.
&engine // Context to the GameTextInputGetStateCB function.
);
}
应用可以选择使用 GameActivity_setTextInputState()
初始化 GameTextInputState
内容。
使用 GameTextInput API 获取 TextInput 状态
应用还可以直接使用 GameTextInput
API 来检索当前的 GameTextInputState
- 使用
GameActivity_getTextInput()
来获取 GameActivity 的内部GameTextInput
实例。 - 有了
GameTextInput
实例,调用GameTextInput_getState()
来获取相同的GameTextInputState
内容。
同样,请注意,应用不应直接初始化 GameTextInput
;GameActivity
已在其初始化过程中执行此操作。
回调机制与 GameActivity 的 GameActivity_getTextInputState()
函数所使用的机制相同。
参考资料
开发者在创建 GameActivity
应用时可能会发现以下资源很有帮助
- GameActivity 入门
- GameTextInput 用户文档
- agdkTunnel 示例
- GameActivity 的 Jetpack 参考文档
- GameTextInput 的 Jetpack 参考文档
- AGDK 源代码
反馈
GameActivity 和 GameTextInput 都是 Jetpack 游戏库的一部分。如有任何问题,请在 Google IssueTracker 上提交 bug。