文章目录

  • 前言
  • 屏幕旋转“预热”
    • android:screenOrientation
    • android:configChanges
    • Acitvity onConfigurationChanged(newConfig: Configuration?)
    • 代码控制方向
  • 跟随系统
  • 重力感应
  • 总结

前言

关于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) {@Overridepublic 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"。

Android App屏幕旋转要点相关推荐

  1. android 屏幕旋转流程,android自动屏幕旋转流程分析.doc

    android自动屏幕旋转流程分析.doc android自动屏幕旋转流程分析 在android设置(Settings)中我们可以看到显示(display)下有一个自动屏幕旋转的checkbox, 如 ...

  2. Android 禁止屏幕旋转 旋转屏幕时保持Activity内容

    Android 禁止屏幕旋转 & 旋转屏幕时保持Activity内容 1.在应用中固定屏幕方向. 在AndroidManifest.xml的activity中加入:            an ...

  3. Android实现屏幕旋转方法

    本文实例总结了Android实现屏幕旋转方法.分享给大家供大家参考.具体如下: 在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制: 默认情况下,当用户手机的重力感应器打开后,旋转屏幕方 ...

  4. Android之屏幕旋转之后当前activity被finish了依然被拉起来

    1 问题 屏幕旋转之后当前activity被finish了依然被拉起来 2 分析思路 不用finish函数,使用 android.os.Process.killProcess(android.os.P ...

  5. Android处理屏幕旋转时的解决方案

    Android的Activity在不明确的指定屏幕方向和configChanges,当用户进行屏幕旋转时,Activity就会重新启动,这个时候需要考虑的就是数据的保存与恢复,Android给出了一下 ...

  6. Android监测屏幕旋转

    监测屏幕旋转的方案,这里简要说一下screenOrientation,OrientationEventListener,SensorEventListener. 方案一 screenOrientati ...

  7. android 手机屏幕旋转机制与使用说明

    android 屏幕旋转机制与使用说明 一 Overview 在开发android应用的时候,有可能需要让应用程序随着系统设置而进行调整,比如判断系统的屏幕方向.判断系统方向的方向导航设备等.除此之外 ...

  8. Android 打开屏幕旋转

    2019独角兽企业重金招聘Python工程师标准>>> 添加设置读写权限: <uses-permission android:name="android.permis ...

  9. Android 禁止屏幕旋转

    Android 开发中禁止屏幕旋转 我们通常有两种方案 方案一 在AndroidManifest.xml 中设置activity 中的android:screenOrientation 属性值 方案二 ...

最新文章

  1. matlab 全局变量
  2. 记住这35个英文单词,你就可以在RPA界混了!
  3. 1.1.2 ADO.NET模型
  4. 重庆南岸召开总结会,今年将引进30家车联网企业
  5. 疫情之下,这些公司开始给员工发菜了!
  6. [原创]SQL 表值函数:获取从今天计算起往前自定义天数
  7. Intel3945ABG无线上网问题总结
  8. android Handler Message传递参数,handler子线程和主线程通讯
  9. java 内置锁_深入理解java内置锁(synchronized)和显式锁(ReentrantLock)
  10. 吓坏了!智能锁半夜自己“离奇打开”
  11. android - 调用系统分享功能分享图片
  12. 科多大数据_redis缓存的简单使用—科多大数据
  13. 成功烧写TMS320F2812经验
  14. 计算机水平考试模块数量,职称计算机考试科目、模块数量是什么
  15. Tbase数据库入坑记
  16. 9月【笔耕不辍】勋章活动获奖名单公布
  17. 大文件切割和大文件合并
  18. 二阶系统响应指标图_二阶系统的脉冲响应.ppt
  19. C语言串口通信R8T8,K60-串口通信
  20. 电视上玩android游戏,如何用u盘下载游戏在android系统电视上玩?

热门文章

  1. Android P SELinux (二) 开机初始化与策略文件编译过程
  2. 关于子类重写父类方法的问题
  3. CSS设置输入框默认文字颜色(webkit-input-placeholder等)
  4. oracle11g安装EM配置失败,oracle 11g Enterprise Manager配置失败
  5. 报错:实体名称必须紧跟在 '' 后面
  6. 使用LDO进行电压转换,24V转5V电路为什么中间要加一个中间电压做转化
  7. 打印的资料怎么装订成册?
  8. 信号(signal,kill,raise)
  9. Linux权限drwxrwxrwx是什么意思?
  10. Broccoli Tree Creator 使用说明 3_3、Girth Transform Node (周长变换节点)