GameActivity の TextInput Android Game Development Kit の一部。
GameActivity は次の方法で GameTextInput を統合しています。
- ラッパーを提供する
- 新しいテキスト入力イベントの可用性に関するフラグを作成する
- テキスト コンテンツ用の GameTextInput の状態バッファを直接使用する
次の図に示すように、アプリはユーザー テキスト入力用にさまざまな内部論理コンポーネントを使用します。
組み込みの GameTextInput
ライブラリの使用は、主に次の 3 つのステップに分けられます。
- UI のソフト キーボードを制御する
- 新しいテキストが利用可能になったことを認識する
- ユーザー入力テキストとその状態を取得する
このドキュメントの後半では、上記について詳しく説明します。GameActivity
が使用されている GameTextInput
の実例については、games-samples リポジトリをご覧ください。
UI のソフト キーボードを制御する
GameActivity
には、UI のソフト キーボードを制御するための関数が 2 つ用意されています。
GameActivity_showSoftInput()
はソフト キーボードを表示します。GameActivity_hideSoftInput()
はソフト キーボードを非表示にします。
これらの定義については、API リファレンス ドキュメントをご覧ください。キーボードが表示されたときのアプリの UI は次のようになります。
テキストが利用可能かを確認する
ソフト キーボード イベントは、Java 側の GameTextInput
から JNI を通じて C/C++ 側に渡され、GameActivity のラッパーまで進み、最終的に native_app_glue
で実装されている android_app::textInputState
フラグに反映されます。アプリは次のように、このフラグを定期的にポーリングして、目的の処理を実行する必要があります。
- 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_pollAll(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
型のコールバック関数を実装します。 - 未処理のイベントが 1 つ以上ある場合に、
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 Issue Tracker でバグを登録してください。