• Android App屏幕旋转要点



    前言

    关于app横竖全屏切换,大多数属于音视频播放类app,电子书、文档类的应用。那么对于王者荣耀、吃鸡等横屏模式的游戏应用,正常游戏场景只会横着旋转,只有部分活动页面(h5)需要竖着看,这种情况下可以切换为竖屏。然而有相当一部分应用跟随系统的旋转设置,自身不关切和调用屏幕旋转的接口,app跟着系统的旋转设置变化。另外一些小伙伴要求修改为跟随系统的自动旋转设置。

    屏幕旋转“预热”

    屏幕旋转与activity的属性设定有关,主要是android:screenOrientationandroid:screenOrientation

    android:screenOrientation

    • unspecified,默认值,由系统决定,不同手机可能不一致
    • landscape,固定横屏显示 不论手机是否开启自动旋转
    • portrait,固定竖屏显 不论手机是否开启自动旋转
    • behind,与前一个activity方向相同
    • sensor,根据物理传感器方向转动,用户90度、180度、270度旋转手机方向,activity都更着变化
    • sensorLandscape,横屏旋转,一般横屏游戏(王者 吃鸡)手机横着再转180时,activity会转过来
    • sensorPortrait,竖屏旋转 也有一部分游戏(天龙八部手游竖屏)手机竖转180,activity会转过来
    • nosensor,旋转设备时候,界面不会跟着旋转。初始化界面方向由系统控制
    • user,用户当前设置的方向

    具体使用例如:android:screenOrientation=“unspecified”

    android:configChanges

    • “mcc” :国际移动用户识别码所属国家代号发生改变
      sim被侦测到了,去更新mcc,mcc是移动用户所属国家代号
    • “mnc”: 国际移动用户识别码的移动网号码改变了
      sim被侦测到了,去更新mnc,MNC是移动网号码,最多由两位数字组成,用于识别移动用户所归属的移动通信网
    • “locale”: 地址改变了-----用户选择了一个新的语言会显示出来
    • “touchscreen”: 触摸屏是改变了------通常是不会发生的
    • “keyboard” :键盘发生了改变----例如用户用了外部的键盘
    • “keyboardHidden”: 键盘的可用性发生了改变
    • “navigation”: 导航发生了变化-----通常也不会发生
    • “screenLayout”: 屏幕的显示发生了变化------不同的显示被激活
    • “fontScale”: 字体比例发生了变化----选择了不同的全局字体
    • “uiMode”: 用户的模式发生了变化
    • “orientation”: 屏幕方向改变了
    • “screenSize”: 屏幕大小改变了
    • “smallestScreenSize”: 屏幕的物理大小改变了,如:连接到一个外部的屏幕上

    具体使用示例:android:configChanges=“orientation”,其中"orientation" 就是本文重点关注的点。

    Acitvity onConfigurationChanged(newConfig: Configuration?)

    这个方法是Activity在横竖切换时候重新创建相对于,一般情况下屏幕旋转,activity都会重新创建,往往在旋转时不需要activity重建,怎么办呢?
    要借助android:configChanges属性了,现阶段将该属性值设置为android:configChanges=“orientation|screenSize|keyboardHidden”
    不论是跟随系统的“自动旋转”、或是根据重力感应来设定方向,或是sensor类的属性引起的屏幕旋转,Acitvity的 onConfigurationChanged函数都会被调用。此时可以在onConfigurationChanged中处理横屏竖屏的界面控制了。

    代码控制方向

    如果要在代码中切换显示方向,调用代码如下,根据期望传相应的参数

    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
    
    • 1

    跟随系统


    首先上个图
    在这里插入图片描述
    图中自动旋转,开启后,如果应用跟着手机横竖切换而变化了方向,那么是跟随系统的。大部分app的activity没有特殊方位需求(也就是没有android:screenOrientation属性),在AndroidManifest中只有一个android:name的属性,这种anctivity自然就是跟随这个设置项的。总的一句话没有这个属性或这个属性的值是unspecified,那么就会跟随这个这个“自动旋转”,开启后手机旋转,activity也会跟着旋转,关闭则不会旋转。

    重力感应


    重力感应就是代码中设定activity的方向,方向则是根据重力感应(OrientationEventListener)的角度来判断,如下:

     protected void startOrientation(final Context context) {
            mOrientationListener = new OrientationEventListener(context) {
                @Override
                public void onOrientationChanged(int rotation) {
                    if (!bEnable) {
                        return;
                    }
                    if (((rotation >= 0) && (rotation <= 45)) || (rotation >= 315)
                            || ((rotation >= 135) && (rotation <= 225))) {
                            // portrait 竖屏
                            ((Activity)getContext()).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
                    } else if (((rotation > 45) && (rotation < 135))
                            || ((rotation > 225) && (rotation < 315))) {// landscape
                            //横屏
                            ((Activity)getContext()).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    }
                }
            };
            bEnable = true;
            mOrientationListener.enable();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    说明:
    1、其中这个角度大小可以根据需要适当调整
    2、这个方法在某些设备上效果是反的,主要是一些平板,这种目前是让用户来校正,校正后记住正反,但还是需要用户来操作,体验还是不够。

    总结

    根据这个文章下来回答了如下问题:
    1、跟随系统“自动旋转”设置,本质上就是去除原有的横竖设置代码,并将android:screenOrientation属性去除。也不需要去查询或监听系统的这个开关项。
    2、OrientationEventListener有些设备不准确的问题,我们可以使用sensor类的属性,这样方位是准确的,同时也不需要代码去指定方向。同时也不用受到系统的“自动旋转”影响。当然如遇到有摄像头的应用,此方法可能不行。
    3、自Android 3.2(API 13),在设置Activity的android:configChanges=“orientation|keyboardHidden”,发生旋转后,activity会重新创建。因为screen size也开始跟着设备的横竖切换而改变。所以TargetSdkVersion属性大于等于13的情况下,想阻止程序在运行时重新加载Activity,还必须增加设置"ScreenSize"。

  • 相关阅读:
    ts装饰器保存this指向
    SQL教育行业案例:学员续费如何分析?(case when、窗口函数)
    Spring Boot集成JPA和ClickHouse数据库
    凯云科技 | 专业嵌入式测试软硬件整体解决方案供应商
    全业务链管理平台Odoo
    算法金 | 选择最佳机器学习模型的 10 步指南
    反射获取类、方法、属性
    uni-app - 树形结构选择器组件(支持单选 / 多选 / 可选择父级 / 弹框形式)树形控件 tree 无限级节点树,树插件完整源码,最好用的组件教程
    三门问题的 Python 实验数据 & 直观但非严谨的证明
    WebRTC系列-网络传输之7-ICE补充之提名(nomination)与ICE_Model
  • 原文地址:https://blog.csdn.net/lanlangaogao/article/details/126100240