Android在横竖屏切换的时候有很多细节需要处理,尤其做视频播放的时候,下面的工具类能较完美的解决横竖屏切换场景,不管是Activity和Fragment都能灵活控制,用法简单。
1、在系统屏幕旋转开启下根据重力感应自动横竖屏切换,且不重走生命周期。
在AndroidManifest.xml中配置Activity的属性:
android:configChanges="orientation|keyboardHidden|screenSize"
如果想默认Activity为竖屏或者横屏,可以配置:
android:screenOrientation="portrait"//竖屏
android:screenOrientation="landscape"//横屏
2、动态设置为横屏或者竖屏。
设置竖屏:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
设置横屏:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
3、如何在手动设置横竖屏后依然能够根据重力感应去切换横竖屏。
但是在实际操作中发现,一旦手动设置了横屏或者竖屏,就无法在通过重力感应来自动切换横竖屏了。此时就需要通过OrientationEventListener的onOrientationChanged(int orientation)方法来判断当前手机的角度,然后再开启屏幕自动旋转。
4、封装工具类。
public class OrientationDetector extends OrientationEventListener {
/**
* Activity
*/
private Activity mActivity;
/**
* 记录用户手机屏幕的位置
*/
private int mOrientation = -1;
/**
* 构造方法
*
* @param activity 当前Activity
*/
public OrientationDetector(Activity activity) {
super(activity);
mActivity = activity;
}
@Override
public void onOrientationChanged(int orientation) {
if (mActivity == null || mActivity.isFinishing()) {
return;
}
//记录用户手机上一次放置的位置
int mLastOrientation = mOrientation;
if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
//手机平放时,检测不到有效的角度,重置为原始位置 -1
mOrientation = -1;
return;
}
//只检测是否有四个角度的改变
if (orientation > 350 || orientation < 10) {
//0度,竖直
mOrientation = 0;
} else if (orientation > 80 && orientation < 100) {
//90度,右侧横屏
mOrientation = 90;
} else if (orientation > 170 && orientation < 190) {
//180度,反向竖直
mOrientation = 180;
} else if (orientation > 260 && orientation < 280) {
//270度,左侧横屏
mOrientation=270;
}
//如果用户关闭了手机的屏幕旋转功能,不再开启代码自动旋转了,直接return
try {
//1 手机已开启屏幕旋转功能 0 手机未开启屏幕旋转功能
if (Settings.System.getInt(mActivity.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION) == 0) {
return;
}
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
//当检测到用户手机位置距离上一次记录的手机位置发生了改变,开启屏幕自动旋转
if (mLastOrientation != mOrientation) {
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
}
/**
* 设置横竖屏
* @param orientation 方向
*/
public void setRequestedOrientation(int orientation){
mActivity.setRequestedOrientation(orientation);
}
}
5、如何使用。
private OrientationDetector mOrientationDetector;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mOrientationDetector = new OrientationDetector(this);
}
mOrientationDetector.enable();//在需要启用开启重力感应的地方开启
mOrientationDetector.disable();//在需要关闭重力感应的地方关闭