フリープログラマー日記

iOS,アンドロイド開発を気ままにしながら生きてるおじさんのブログです。

第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間を移動するのもたくさん紹介されていますので、このような異端?とも言える方法があると知ってもらえたらいいのでは、と思っています。