Android App屏幕旋转要点
文章目录
- 前言
- 屏幕旋转“预热”
- android:screenOrientation
- android:configChanges
- Acitvity onConfigurationChanged(newConfig: Configuration?)
- 代码控制方向
- 跟随系统
- 重力感应
- 总结
前言
关于app横竖全屏切换,大多数属于音视频播放类app,电子书、文档类的应用。那么对于王者荣耀、吃鸡等横屏模式的游戏应用,正常游戏场景只会横着旋转,只有部分活动页面(h5)需要竖着看,这种情况下可以切换为竖屏。然而有相当一部分应用跟随系统的旋转设置,自身不关切和调用屏幕旋转的接口,app跟着系统的旋转设置变化。另外一些小伙伴要求修改为跟随系统的自动旋转设置。
屏幕旋转“预热”
屏幕旋转与activity的属性设定有关,主要是android:screenOrientation
和 android: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屏幕旋转要点相关推荐
- android 屏幕旋转流程,android自动屏幕旋转流程分析.doc
android自动屏幕旋转流程分析.doc android自动屏幕旋转流程分析 在android设置(Settings)中我们可以看到显示(display)下有一个自动屏幕旋转的checkbox, 如 ...
- Android 禁止屏幕旋转 旋转屏幕时保持Activity内容
Android 禁止屏幕旋转 & 旋转屏幕时保持Activity内容 1.在应用中固定屏幕方向. 在AndroidManifest.xml的activity中加入: an ...
- Android实现屏幕旋转方法
本文实例总结了Android实现屏幕旋转方法.分享给大家供大家参考.具体如下: 在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制: 默认情况下,当用户手机的重力感应器打开后,旋转屏幕方 ...
- Android之屏幕旋转之后当前activity被finish了依然被拉起来
1 问题 屏幕旋转之后当前activity被finish了依然被拉起来 2 分析思路 不用finish函数,使用 android.os.Process.killProcess(android.os.P ...
- Android处理屏幕旋转时的解决方案
Android的Activity在不明确的指定屏幕方向和configChanges,当用户进行屏幕旋转时,Activity就会重新启动,这个时候需要考虑的就是数据的保存与恢复,Android给出了一下 ...
- Android监测屏幕旋转
监测屏幕旋转的方案,这里简要说一下screenOrientation,OrientationEventListener,SensorEventListener. 方案一 screenOrientati ...
- android 手机屏幕旋转机制与使用说明
android 屏幕旋转机制与使用说明 一 Overview 在开发android应用的时候,有可能需要让应用程序随着系统设置而进行调整,比如判断系统的屏幕方向.判断系统方向的方向导航设备等.除此之外 ...
- Android 打开屏幕旋转
2019独角兽企业重金招聘Python工程师标准>>> 添加设置读写权限: <uses-permission android:name="android.permis ...
- Android 禁止屏幕旋转
Android 开发中禁止屏幕旋转 我们通常有两种方案 方案一 在AndroidManifest.xml 中设置activity 中的android:screenOrientation 属性值 方案二 ...
最新文章
- matlab 全局变量
- 记住这35个英文单词,你就可以在RPA界混了!
- 1.1.2 ADO.NET模型
- 重庆南岸召开总结会,今年将引进30家车联网企业
- 疫情之下,这些公司开始给员工发菜了!
- [原创]SQL 表值函数:获取从今天计算起往前自定义天数
- Intel3945ABG无线上网问题总结
- android Handler Message传递参数,handler子线程和主线程通讯
- java 内置锁_深入理解java内置锁(synchronized)和显式锁(ReentrantLock)
- 吓坏了!智能锁半夜自己“离奇打开”
- android - 调用系统分享功能分享图片
- 科多大数据_redis缓存的简单使用—科多大数据
- 成功烧写TMS320F2812经验
- 计算机水平考试模块数量,职称计算机考试科目、模块数量是什么
- Tbase数据库入坑记
- 9月【笔耕不辍】勋章活动获奖名单公布
- 大文件切割和大文件合并
- 二阶系统响应指标图_二阶系统的脉冲响应.ppt
- C语言串口通信R8T8,K60-串口通信
- 电视上玩android游戏,如何用u盘下载游戏在android系统电视上玩?
热门文章
- Android P SELinux (二) 开机初始化与策略文件编译过程
- 关于子类重写父类方法的问题
- CSS设置输入框默认文字颜色(webkit-input-placeholder等)
- oracle11g安装EM配置失败,oracle 11g Enterprise Manager配置失败
- 报错:实体名称必须紧跟在 '' 后面
- 使用LDO进行电压转换,24V转5V电路为什么中间要加一个中间电压做转化
- 打印的资料怎么装订成册?
- 信号(signal,kill,raise)
- Linux权限drwxrwxrwx是什么意思?
- Broccoli Tree Creator 使用说明 3_3、Girth Transform Node (周长变换节点)