Android横竖屏切换工具

4,587 阅读2分钟

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();//在需要关闭重力感应的地方关闭