画面の下に表示されている(配置されている)
ここでは、Back ボタンの検出と処理方法を、私がどう実装したか、書いています。
このページ、および開発関連ページは、PC向けデザインとなっております。 画面サイズの小さいスマホでは、快適な表示が得られませんので、ご了承ください。
ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
また、本サイトが初めての方は、まずこのページの注意事項をご覧ください。
android_main 関数で、
state->onInputEvent = engine_handle_input;
と設定していますので、入力は engine_handle_input 関数が受け取ります。 この関数は、main.cpp で、次のように定義されています。
static int32_t engine_handle_input(struct android_app* app, AInputEvent* event)
第2引数で受け取る AInputEvent* event を使って、 AInputEvent_getType(event) 関数が AINPUT_EVENT_TYPE_KEY を返すとき、発生したのはキー入力ということがわかります。
キー入力の実行は、UP イベント(指を離した)が発生したときだけでよいと考えられるので、
AKeyEvent_getAction(event) 関数が
AKEY_EVENT_ACTION_UP を返すとき、キー処理をする、とします。
※ 実機テストでは、押しっぱなしでも処理されてしまいましたが・・・
キーの UP イベントであったとき、 AKeyEvent_getKeyCode(event) 関数でキーコードを調べて、どのキーの処理をするかを判断します。
AKEYCODE_BACK であったとき、Back キーですので、戻る機能を処理します。 処理したときは、engine_handle_input 関数が 1 を返す必要があります。 もし 0 を返すと、アプリがサスペンドされ、バックグラウンドになります(ホーム画面になる)。
私は、なるべく今後簡単にコーディングができるように、 CAppCore と名前を付けたクラスを定義し、 それを継承した CApp クラスを用意しました。
class CApp : public CAppCore
グローバルで、CApp g_app を用意して、キー入力処理を行う関数
bool CAppCore::coreInputEventKey(struct android_app* app, AInputEvent* event)
を定義しました。
main.cpp ではキー入力イベントがあったことを判定したら、この関数を呼び出して処理を行います。 main.cpp は、なるべく何もいじらないようにしたいと思いました。
static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) { struct engine* engine = (struct engine*)app->userData; if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) { // ここにはタッチの処理を記述します。 } // キー入力があるとき if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_KEY) { if (g_app.coreInputEventKey(app, event)) { return 1; } } return 0; }
coreInputEventKey 関数が trueを返したら、1 を返しています。「処理した」という意味になります。
CAppCore クラスでは、
bool CAppCore::coreInputEventKey(struct android_app* app, AInputEvent* event) { // アップのときだけ処理すればよいと考えられます。 if (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_UP) { switch (AKeyEvent_getKeyCode(event)) { case AKEYCODE_BACK: return OnKeyUpBack(app, event); default: return OnKeyUp(app, event, AKeyEvent_getKeyCode(event)); } } return false; }
のようにして、Back キーのときには OnKeyUpBack 関数を、 それ以外のキーのときには OnKeyUp 関数を呼び出しています。 今は Back キーだけ知りたかったのでこうなっていますが、他のキーについて特別な処理が欲しい場合は、拡張するかも知れません。
どちらの関数も、CAppCore クラスに
virtual bool OnKeyUpBack(struct android_app* app, AInputEvent* event) { return false; }
のように仮の実装をしておいて、とりあえず(正しくなくても)ビルドが通るようにしています。
アプリで処理する必要があるとき(コードを実装するとき)、CApp クラスで
protected: bool OnKeyUpBack(struct android_app* app, AInputEvent* event);
と定義して、実装しています。 具体的には、トップ画面でない画面だったらトップ画面に戻す、という処理を入れています。