前言
屏幕旋转的机制;
默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,则表现为卡顿或者黑屏一段时间;
今天就介绍下平面旋转方面的知识点;
一、screenOrientation属性说明
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设置;
android:name=".test1"
android:screenOrientation="landscape" />
android:name=".test2"
android:screenOrientation="portrait" />
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
横屏或者竖屏是被直接定死,旋转方向不会变化,只有一个方向(意思是旋转180°也不会改变),当然就不会在手机旋转的时候重启activity;
2、代码设置
调用setRequestedOrientation()函数,其效果就是和在
AndroidManifest中设置一样的,当前方向和设置的方向不一致的时候,会重启activity,一致的话不会重启;
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//默认设置
- 1.
- 2.
- 3.
- 4.
- 5.
注意点:
不想activity被重启,可以在AndroidManifest中加上android:configChanges(orientation|screenSize这两个一定要加上)
<activity
android:name=".MainActivity"
android:screenOrientation="sensor"
android:configChanges="keyboardHidden|orientation|screenSize">
- 1.
- 2.
- 3.
- 4.
3、监听屏幕旋转变化
重写onConfigurationChanged方法
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d(TAG, "onConfigurationChanged");
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
这个方法将会在屏幕旋转变化时调用,可以在这里做出我们在屏幕变化时想要的操作,并且不会重启activity。但它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用;
4、自定义旋转监听设置
想更加完美,更加完全的掌控监听屏幕旋转变化,就的自定义旋转监听
(1)创建一个类继承OrientationEventListener
(2)开启和关闭监听
可以在 activity 中创建MyOrientationDetector 类的对象,注意,监听的开启的关闭,是由该类的父类的 enable() 和 disable() 方法实现的;
因此,可以在activity的 onResume() 中调用MyOrientationDetector 对象的 enable方法,在 onPause() 中调用MyOrientationDetector 对象的 disable方法来完车功能;
(3)监测指定的屏幕旋转角度
MyOrientationDetector类的onOrientationChanged 参数orientation是一个从0~359的变量,如果只希望处理四个方向,加一个判断即可:
OrientationEventListener mOrientationListener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOrientationListener = new OrientationEventListener(this,
SensorManager.SENSOR_DELAY_NORMAL) {
@Override
public void onOrientationChanged(int orientation) {
if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
return; //手机平放时,检测不到有效的角度
}
//只检测是否有四个角度的改变
if (orientation > 350 || orientation < 10) { //0度
orientation = 0;
} else if (orientation > 80 && orientation < 100) { //90度
orientation = 90;
} else if (orientation > 170 && orientation < 190) { //180度
orientation = 180;
} else if (orientation > 260 && orientation < 280) { //270度
orientation = 270;
} else {
return;
}
Log.v(DEBUG_TAG,"Orientation changed to " + orientation);
}
};
if (mOrientationListener.canDetectOrientation()) {
Log.v(DEBUG_TAG, "Can detect orientation");
mOrientationListener.enable();
} else {
Log.v(DEBUG_TAG, "Cannot detect orientation");
mOrientationListener.disable();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mOrientationListener.disable();
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
总结
快年底了,很多人都要找工作或者写毕业设计,有不懂就发私信给我,或许可以给你点帮助建议;
我们一起努力进步;