Android、Java、Web系、Linux、マラソン等の備忘録

2013/09/19

Android 現状の見てる状態の画面回転をロック

0 件のコメント
Android端末でごちゃごちゃ処理している時に画面を回転させると、onDestroyが呼ばれActivityが再生成されて面倒なわけですが、ちょっとした処理を待たせるような時はActivity再生成の対策を考えるよりは画面を固定してしまった方が面倒なことも少ない。というわけで、ググってみるとあまりコレだ!という感じのがなかなか出てこないのでメモしておきます。

まあ、(たぶん)昔の端末は画面の回転は縦か横かだったのが、最近のは画面の向きに即して4パターン変る仕様になったのと & ユーザ側で画面をロックしたいなどのアプリ利用でのノウハウもあってすぐに出てこないと言った感じでしょうか。

こちらに、ありがたいメソッドがあるのですが、
・Androidで回転を固定にしたり解除したりする方法について : 新・開発者の戯言
http://blog2.kojin.biz/2010/04/23/androidで回転を固定にしたり解除したりする方法につ/
 これは、縦か横かの固定なので、Android 2.1と2.3とかの端末だとうまく行くのですが、Nexus 7とかを逆の縦(逆の横)に向けておいて、このメソッドを走らせると画面がくるんと回って固定されてしまうわけです。そして解除するとくるんと元に戻る。

そういうのもひっくるめていいやり方がありました。
・How to Lock screen orientation when displaying reverse landscape in android? - Stack Overflow
http://stackoverflow.com/questions/6410237/how-to-lock-screen-orientation-when-displaying-reverse-landscape-in-android
autremoiさんの回答でlockScreenOrientation()のメソッド。4パターン判定して固定しています。Surface.ROTATION_180とSurface.ROTATION_270に直接値が入ってますが、これはSCREEN_ORIENTATION_REVERSE_PORTRAITとSCREEN_ORIENTATION_REVERSE_LANDSCAPEがAPI Level 9以上であることから、それ以前用に向けてのことです。
・ActivityInfo | Android Developers
http://developer.android.com/reference/android/content/pm/ActivityInfo.html#SCREEN_ORIENTATION_REVERSE_LANDSCAPE
まあ、そもそもSurface.ROTATION_180にSurface.ROTATION_270入らないので大丈夫のような気がしなくもないですが。

上記2つのメソッドから使い回しできるようstaticメソッドに書き換えたのを載せておきます。

    /**
     * 画面の回転を固定・解除する関数
     * @param flg 真なら回転固定 偽なら回転可能
     */
    public static void lockScreenOrientation(Activity activity, Boolean flg){
        if(flg){
            switch (((WindowManager) activity.getSystemService(Activity.WINDOW_SERVICE))
                    .getDefaultDisplay().getRotation()) {
            case Surface.ROTATION_90:
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                break;
            case Surface.ROTATION_180:
                activity.setRequestedOrientation(9/* reversePortait */);
                break;
            case Surface.ROTATION_270:
                activity.setRequestedOrientation(8/* reverseLandscape */);
                break;
            default :
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
        }else{
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
        }
    }

PR
Androidプログラミングレシピ増補改訂版 アーキテクチャ/UI/ネットワーク編

0 件のコメント :

コメントを投稿