屏幕旋转切换机制详解

276次阅读  |  发布于3年以前

前言

屏幕旋转的机制;

默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,则表现为卡顿或者黑屏一段时间;

今天就介绍下平面旋转方面的知识点;

一、screenOrientation属性说明

android:screenOrientation属性说明:

二、屏幕旋转详解

1、配置文件设置

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

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">

3、监听屏幕旋转变化

重写onConfigurationChanged方法

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

这个方法将会在屏幕旋转变化时调用,可以在这里做出我们在屏幕变化时想要的操作,并且不会重启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();
    }

总结

快年底了,很多人都要找工作或者写毕业设计,有不懂就发私信给我,或许可以给你点帮助建议;

我们一起努力进步;

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8