Android 屏幕旋转切换总结
2018-04-02 本文已影响0人
游戏中的龙
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();
关闭监听。