
画面の下に表示されている(配置されている)
こんなボタンです。
)
ここでは、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);
と定義して、実装しています。 具体的には、トップ画面でない画面だったらトップ画面に戻す、という処理を入れています。

