Android屏幕旋转重建小结

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

// 横屏设置
android:screenOrientation="landscape"
// 竖屏设置
android:screenOrientation="portrait"

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

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

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

//横屏设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//竖屏设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//默认设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

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

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

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

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

<activity android:name=".Test"
 android:configChanges="orientation|keyboard">
</activity>

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

android:configChanges="keyboardHidden|orientation|screenSize"

设置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);
    }
}

优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
缺点:它只能一次旋转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();

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

欢迎关注微信公众号:DroidMind
精品内容独家发布平台


呈现与博客不一样的技术干货

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值