Android 屏幕旋转切换总结

转发的,记一下状态属性。原文:https://www.jianshu.com/p/5f3437f11f96

android:screenOrientation属性说明:

  • unspecified,默认值,由系统决定,不同手机可能不一致
  • landscape,强制横屏显示,只有一个方向
  • portrait,强制竖屏显,只有一个方向
  • behind,与前一个activity方向相同
  • sensor,根据物理传感器方向转动,用户90度、180度、270度旋转手机方向,activity都更着变化,会重启activity(无论系统是否设置为自动转屏,activity页面都会跟随传感器而转屏)
  • sensorLandscape,横屏旋转,就是可以上下旋转,有两个方向,不会重启activity
  • sensorPortrait,竖屏旋转,就是可以上下旋转,有两个方向,不会重启activity
  • nosensor,旋转设备时候,界面不会跟着旋转。初始化界面方向由系统控制(无论系统是否设置为自动转屏,activity页面都不会转屏)
  • user,用户当前设置的方向
  • reverseLandscape,与正常的横向方向相反显示(反向横屏)
  • reversePortrait,与正常的纵向方向相反显示(反向竖屏)(我设置没用)

1、AndroidManifest.xml设置

  <activity
            android:name=".ManifestHorizontalActivity"
            android:screenOrientation="landscape" /><!--横屏设置-->
        <activity
            android:name=".ManifestVerticalActivity"
            android:screenOrientation="portrait" /><!--竖屏设置-->

直接如上代码设置,横屏或者竖屏是被直接定死,旋转方向不会变化,只有一个方向(意思是旋转180°也不会改变),当然就不会在手机旋转的时候重启activity。

2、代码动态设置

想要在代码中设置,就需要调用setRequestedOrientation()函数,其效果就是和在
AndroidManifest中设置一样的,当前方向和设置的方向不一致的时候,会重启activity,一致的话不会重启。

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

如果不想activity被重启,可以在AndroidManifest中加上android:configChanges(orientation|screenSize这两个一定要加上)

 <activity
            android:name=".MainActivity"
            android:screenOrientation="sensor"
            android:configChanges="keyboardHidden|orientation|screenSize">

之后在Activity中重写onConfigurationChanged方法(如果你不需要做监听处理,可以不写)

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged");
    }

这个方法将会在屏幕旋转变化时调用,可以在这里做出我们在屏幕变化时想要的操作,并且不会重启activity。但它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用。
如果想要更详细的监听旋转的角度,就要使用到OrientationEventListener,
private OrientationEventListener orientationEventListener;
在onCreate中初始化监听器

    mOrientationListener = new OrientationEventListener(this) {
            @Override
            public void onOrientationChanged(int orientation) {
                Log.d(TAG, "onOrientationChanged: " + orientation);
                if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
                    return; // 手机平放时,检测不到有效的角度
                }
                // 只检测是否有四个角度的改变
                if (orientation > 350 || orientation < 10) {
                    // 0度:手机默认竖屏状态(home键在正下方)
                    Log.d(TAG, "下");
                } else if (orientation > 80 && orientation < 100) {
                    // 90度:手机顺时针旋转90度横屏(home建在左侧)
                    Log.d(TAG, "左");
                } else if (orientation > 170 && orientation < 190) {
                    // 180度:手机顺时针旋转180度竖屏(home键在上方)
                    Log.d(TAG, "上");
                } else if (orientation > 260 && orientation < 280) {
                    // 270度:手机顺时针旋转270度横屏,(home键在右侧)
                    Log.d(TAG, "右");
                }
            }
        };

之后调用 mOrientationListener.enable();打开监听和mOrientationListener.disable();关闭监听。

猜你喜欢

转载自blog.csdn.net/qq_24712507/article/details/103022726
今日推荐