Android屏幕旋转

本文介绍了Android中处理屏幕旋转的四种方式:1)通过AndroidManifest.xml设置横竖屏;2)代码动态设置屏幕方向;3)重写onConfigurationChanged避免屏幕旋转导致的卡顿;4)结合OrientationEventListener实现自定义旋转监听,以解决相机预览旋转问题。每种方法的优缺点及使用场景都有详细阐述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 AndroidManifest.xml设置

如果只想设置屏幕横屏或者竖屏,只需要设置横竖屏:

 <!--横屏-->
android:screenOrientation="landscape"
 <!--竖屏-->
android:screenOrientation="portrait"

  这样设置后即使屏幕旋转,Activity也不会出现销毁或方向旋转等反应,屏幕只有一个方向。

二、代码动态设置

  需要动态改变横竖屏设置,只需要在代码中调用setRequestedOrientation()函数,一般在Activity的onCreate方法中设置:

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

  这样做可以随意动态设置横竖屏的要求,但是当改变手机屏幕方向设置Activity会被销毁,重新构建。
  如果用户的手机没有开启方向锁定或者在AndroidManifest.xml中设置了android:screenOrientation,默认情况下,该Activity不会响应屏幕旋转事件。在上述情况下,依然希望Activity能响应屏幕旋转,则添加如下代码:

// onCreate 方法中 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

三、重写onConfigurationChanged

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

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

<activity/>中的详细设置可参考官方文档。传送门

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

android:configChanges="keyboardHidden|orientation|screenSize"

  在Activity配置中添加上面代码切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。因此,在Activity中重写onConfigurationChanged方法,对屏幕方向变化进行监听处理:

/**
 * Configuration newConfig
 */
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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值