第16回 AndroidではRunnableで画面遷移
前回は、swiftでクロージャを使って画面遷移をしましたが、javaでは、Runnableを使うと同じようなことができます。
前回の繰り返しですが、
1.呼び出される側に、ランナブル変数を置く。
2.呼び出し側から、このランナブルに「どこに制御が移るか」を教える。
3.呼び出される側のイベント発生時に、このランナブルを使って、呼び出し側に制御を移す。
となります。
まず、1番ですね。
セッターも一緒に書いておきます。
public class MainMenu extends View { // メニューへ飛ぶためのランナブル private Runnable entryViewRunnable; private Runnable settigViewRunnnable; private Runnable runningViewRunnnable; private Runnable recordViewRunnnable; // コンストラクタ public MainMenu(Context context) { super(context); } // 分岐先を渡すためのランナブルをセット(4種) public void setEntryViewRunnable(Runnable runnable) { entryViewRunnable = runnable; } public void setSettigViewRunnnable(Runnable runnable) { settigViewRunnnable = runnable; } public void setRunningViewRunnnable(Runnable runnable) { runningViewRunnnable = runnable; } public void setRecordViewRunnnable(Runnable runnable) { recordViewRunnnable = runnable; }
swift版とあまり違わないですね。
次にランナブルをセットする呼び出し側。
public void showMainmenu() { // 以前のビューは消しておく this.removeAllViews(); // 端末のサイズを取得 final int width = this.getWidth(); final int height = this.getMeasuredHeight(); // MainMenu のインスタンスを作成。 MainMenu mainMenu = new MainMenu(getContext()); // Runnableを4個セット mainMenu.setEntryViewRunnable(new Runnable() { @Override public void run() { showEntryMenu(); } }); mainMenu.setSettigViewRunnnable(new Runnable() { @Override public void run() { showSetting(); } }); mainMenu.setRunningViewRunnnable(new Runnable() { @Override public void run() { showRunningView(); } }); mainMenu.setRecordViewRunnnable(new Runnable() { @Override public void run() { showRecordView(); } });
AndroidStudioで作業してると、結構自然に補完してくれるので、楽です。
ちょっと名前のちぐはぐなところもあります。あまり、関係ないですが。
最後に、タッチの判定でジャンプするところ。
void judge(float x,float y) { float width = getWidth(); float height = getHeight(); // 4種の判定 // 4コマンド(エントリー・設定・ラップ計測・記録) final float y1 = height/2 - width*0.4f; final float y2 = height/2 - width*0.3f; final float y3 = height/2 + width*0.3f; final float y4 = height/2 + width*0.4f; final float x1 = width * 0.05f; final float x2 = width * 0.3f; final float x3 = width * 0.7f; final float x4 = width * 0.95f; // 判定 if (y > y1 && y < y2) { if (x > x1 && x < x2) { // エントリーメニューの呼び出し entryViewRunnable.run(); } else if (x > x3 && x < x4) { // 設定メニューの呼び出し settigViewRunnnable.run(); } } else if (y > y3 && y < y4) { if (x > x1 && x < x2) { // ラップ計測画面の呼び出し runningViewRunnnable.run(); } else if (x > x3 && x < x4) { // 記録呼び出し画面へ recordViewRunnnable.run(); } }
ランナブルの後ろに .run() とつければいいのですね。
これで、大きな画面移動は完了です。
サブメニューから、元に戻るのも同じ要領ですね。
swiftでビューコントローラー間を行ったり来たりするのも良いですし、javaでActivity間を移動するのもたくさん紹介されていますので、このような異端?とも言える方法があると知ってもらえたらいいのでは、と思っています。