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)

跟随系统


首先上个图
在这里插入图片描述
图中自动旋转,开启后,如果应用跟着手机横竖切换而变化了方向,那么是跟随系统的。大部分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、这个方法在某些设备上效果是反的,主要是一些平板,这种目前是让用户来校正,校正后记住正反,但还是需要用户来操作,体验还是不够。

总结

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

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值