Android屏幕旋转重建小结

http://blog.csdn.net/hp910315/article/details/52143865

Android屏幕旋转重建小结

原创 2016年08月07日 17:55:44

一、. AndroidManifest.xml设置 
单单想设置横屏或者竖屏,那么只需要添加横竖屏代码:

// 横屏设置
android:screenOrientation="landscape"
// 竖屏设置
android:screenOrientation="portrait"
  • 1
  • 2
  • 3
  • 4

那么,默认的情况下,应用启动后,会固定为指定的屏幕方向,即使屏幕旋转,Activity也不会出现销毁或者转向等任何反应。

优点:即使屏幕旋转,Activity也不会重建 
缺点:屏幕只有一个方向

二. 代码动态设置 
需要动态改变横竖屏设置,那么,只需要在代码中调用setRequestedOrientation()函数:

//横屏设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//竖屏设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//默认设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

优点:可以随意动态设置,满足我们人为改变横竖屏的要求,同时满足横竖屏UI不同的设计需求; 
缺点:如果改变设置,那么,Activity会被销毁,重新构建,即重新onCreate;

如果用户的手机没有开启重力感应器或者在AndroidManifest.xml中设置了android:screenOrientation,默认情况下,该Activity不会响应屏幕旋转事件。如果在这种情况下,依然希望Activity能响应屏幕旋转,则添加如下代码:

// activity的 onCreate 函数中 
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
  • 1
  • 2

三. 重写onConfigurationChanged 
如果你不希望旋转屏幕的时候Activity被不断的onCreate(这种情况往往会造成屏幕切换时的卡顿),那么,可以使用此方法: 
首先,在AndroidMainfest.xml中添加configChanges:

<activity android:name=".Test"
 android:configChanges="orientation|keyboard">
</activity>
  • 1
  • 2
  • 3

注意,keyboardHidden表示键盘辅助功能隐藏,如果你的开发API等级等于或高于13,还需要设置screenSize,因为screenSize会在屏幕旋转时改变;

android:configChanges="keyboardHidden|orientation|screenSize"
  • 1

设置Activity的android:configChanges=”orientation|keyboardHidden|screenSize”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

在Activity中重写onConfigurationChanged方法,这个方法将会在屏幕旋转变化时,进行监听处理:

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        setContentView(R.layout.portrait_layout);
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        setContentView(R.layout.landscape_layout);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作; 
缺点:它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用。

四. 结合OrientationEventListener,自定义旋转监听设置 
如果你想更加完美,更加完全的掌控监听屏幕旋转变化,比如,转屏时不想重新onCreate,尤其是在Camera界面,不想出现旋转preview时屏幕的卡顿、黑屏等问题,那么,可以尝试:

private OrientationEventListener mOrientationListener;

mOrientationListener = new OrientationEventListener(this) {
    @Override
    public void onOrientationChanged(int rotation) {
        if (((rotation >= 0) && (rotation <= 45)) || (rotation >= 315)||((rotation >= 135)&&(rotation <= 225))) {
            //portrait
            Log.d(TAG, "Screen orientation is Portrait!");
        } else if (((rotation > 45) && (rotation < 135))||((rotation > 225) && (rotation < 315))) {
            //landscape
            Log.d(TAG, "Screen orientation is Landscape!");
        }
    }
};
mOrientationListener.enable();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

优点:你可以任意随时准确的监听屏幕旋转变化的状态,可以随时动态改变横竖屏状态;

版权声明:本文为博主原创文章,未经博主允许不得转载。
 
 
posted @ 2017-10-29 15:05  sky20080101  阅读(79)  评论(0)    收藏  举报