Android App屏幕旋转要点

文章目录

  • 前言
  • 屏幕旋转“预热”
    • 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"。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML静态页面获取url参数和UserAgent

目录前言原因解决1、静态页面获取url的参数2、取useragent的值3、测试页面前言 接技术支持小伙伴信&#xff1a;有用户反馈app在华为设备上下载不了&#xff0c;以为是服务器覆盖的范围不够或服务器挂了&#xff0c;直到另一个客服同事发来一个录屏&#xff0c;基本知道原因&a…

python mad函数_Python函数的基本定义

老男孩教育的PYTHON自动化开发课程自2013年第1期到现在已经走到了第12期&#xff0c;2年半的时间里&#xff0c;我们每一期都在对课程细节进行不同程度的优化&#xff0c;课程总时长也从最开始的2个月延长至第12期的五到六月&#xff0c;更新内容足足翻了一倍多&#xff0c;我们…

Linux grep命令使用介绍

目录1&#xff0e;命令格式2&#xff0e;命令功能3&#xff0e;命令参数4&#xff0e;正&#xff08;规&#xff09;则表达式5&#xff0e;示例1&#xff1a;查找指定进程2&#xff1a;查找指定进程个数3&#xff1a;从文件中读取关键词进行搜索4&#xff1a;从文件中读取关键词…

Android手机或平板设置浏览器的UserAgent

目录前言修改UserAgent实操华为手机自带浏览器Chrome&#xff08;谷歌浏览器&#xff09;QQ浏览器UC浏览器360浏览器前言 移动互联网盛行的当下&#xff0c;网页在电脑端和移动设备&#xff08;包括手机&#xff0c;平板以及一些基于Android系统定制的设备&#xff09;的适配主…

android jni fork()子进程不运行_Android高级面试谈谈Zygote的理解

Zygoto的作用Zygoto的作用有两个&#xff1a;1. 启动SystemServer2. 孵化应用进程SystemServer也是通过Zygoto来启动的&#xff0c;因为SystemServer需要Zygoto初始化好的一些系统资源&#xff0c;包括常用的类、JNI函数、共享库等等&#xff0c;这些资源直接从Zygoto继承过来对…

送给女朋友的情话

风拂鹊桥霓裳起 与卿漫话风雨里 初识 那一年端午 带着无比喜悦与期待 搭上去福州的火车 那一年端午 从福州到泉州 再到柴塔 连地名都好有神秘的感觉 迷糊的眼镜和疲倦的神情&#xff0c;刚好匹配得上 从此有了我们的传说 到了2022的七月七&#xff0c;还是一如既往 小特效 图…

Linux chmod命令使用介绍

目录1. 命令格式2. 命令功能3. 命令参数必要参数选择参数权限代号4. 使用实例1&#xff1a;增加文件所有用户组可执行权限2&#xff1a;同时修改不同用户权限3&#xff1a;去除文件的权限4&#xff1a;使用“”设置权限5&#xff1a;对一个目录及其子目录所有文件添加权限其他一…

lazada发货_Lazada发货用什么物流?费用要多少?

有买家到Lazada店铺下单之后&#xff0c;卖家就要安排订单发货了。Lazada发货的管控也是比较严格的&#xff0c;各位卖家要及时发货。小编也遇到不少新手卖家的咨询&#xff0c;问Lazada发货方式有哪些&#xff1f;以及发货流程是怎样的&#xff1f;下面针对这些问题&#xff0…

iOS app中不能跳转到商店更新

文章目录问题&#xff1a;跳转没有反应延申说明问题&#xff1a;跳转没有反应 如果app在苹果商店中的访问地址中带有中文&#xff0c;直接使用带中文url是跳转不成功的&#xff0c;需要对这个带中文的url进行UrlEncode编码才能正常跳转。 本文仅针对这种情况&#xff0c;或许还…

导入表格只有一行 帆软_万万没想到!把x个表格合合合合成一份,10分钟就搞定...

正值年中&#xff0c;老板交代把上半年各个地区提交的数据表格做个汇总。怎么办&#xff1f;一个地区一张表打开华南区的表&#xff0c;复制】-打开汇总表-【粘贴】再打开华北区的表【复制】-打开汇总表-【粘贴】……类似的工作任务还真不少各个单位上交的报名表各部门的生产计…

ddrelease64 黑苹果_High Sierra 黑苹果构建 微星X99A GAMING PRO CARBON+i7 6800k+GTX1070

回复文章须知&#xff1a;在本站评论区回复文章的时候&#xff0c;请务必正确填写好你的【电子邮件】地址&#xff0c;正确的填写【电子邮件】你将可以在博主/其他本站网友回复你的时候会收到邮件通知&#xff0c;以便及时查看回复内容&#xff01;本教程仅供小白安装使用&…

macOS/iOS WKWebview 下载文件

WKWebview 下载文件需要通过JS注入的方式来下载。js下载的数据是base64编码的&#xff0c;回到给原生后&#xff0c;原生需要反编码后才是原始文件的数据。 具体步骤&#xff1a; 配置WKWebview的js回调句柄&#xff08;标识&#xff09;创建WKWebview并添加到视图上实现WKScr…

vim插件自动补齐_给VIM添加REPL

REPL: 读取-求值-输出”循环&#xff08;英语&#xff1a;Read-Eval-Print Loop&#xff0c;简称REPL&#xff09;是一个简单的&#xff0c;交互式的编程环境。python作为一个动态语言&#xff0c;REPL在开发过程中起到了很大的作用。可是一直以来用vim写python没有一个很好的&…

Linux ping 详细介绍(win也适用)

多数情况下&#xff0c;能否访问某台电脑或服务器&#xff0c;很自然的使用ping xxx.xxx.xxx.xxx&#xff0c;这是最简单的ping形式&#xff0c;同时看到ping几个包之后就停止(windows)了,linux 会一直ping下去&#xff0c;直到按ctrlc或其他组合键。在windows平台或linux平台&…

巨一自动化工业机器人_工业机器人和自动化设备连接器

来源&#xff1a;大比特商务网 作者&#xff1a;Ann Thryft随着工业物联网(IIOT)不断扩大&#xff0c;给工厂带来了更多电子设备。 这些设备往往暴露在恶劣环境中&#xff0c;包括灰尘、油、液体和极端温度等。 同时&#xff0c;特别是随着协作机器人装配在工厂生产线上&#x…

pvrect r语言 聚类_R语言常用统计方法包+机器学习包(名称、简介)

上期帮大家盘点了一下R中常用的可视化包&#xff0c;这期将简要盘点一下关于统计分析与机器学习的R包&#xff0c;并通过简要介绍包的特点来帮助读者深入理解可视化包。本文作者为“食物链顶端”学习群中的小伙伴&#xff0c;感谢他们的分享。话不多说我们一起来看看吧&#xf…

rap2检测哪些接口在使用_Apifox for Mac(接口调试管理工具)

Apifox 是一款用于接口文档定义、Mock 数据、接口自动化测试等等方面的工具&#xff0c;它的功能高效好用&#xff0c;接口云端同步&#xff0c;实时更新。成熟的团队/项目权限管理&#xff0c;满足各类企业的需求。有需要的朋友赶快来使用吧&#xff01;Apifox 软件介绍软件开…

layui根据name获取对象_layui表格行合并;解决侧边固定栏合并

实现效果图:适配分页&#xff1b;全选&#xff1b;后台嵌套数据&#xff1a;获取数据后&#xff1b;渲染前操作&#xff1a;,done:function(res){if(res.data){for(var i 0;i<res.data.length;i){var trObj $([lay-id"table"] .layui-table-box).find([data-ind…

abap al设置单元格可编辑 oo_利用WPS做业务系统的超级编辑器

业务系统中的数据很笼统的分可以分为两大类&#xff0c;一个是结构化的&#xff0c;通常用关系型数据库来存储管理&#xff1b;一个是非结构化的&#xff0c;在这类数据中&#xff0c;可能最多、价值密度最大的就是文档。如何更便捷高效的生成或分析文档&#xff0c;就是业务系…

pyecharts怎么绘制散点图_pyecharts可视化和wx的结合

前言最近在研究 pyecharts 的用法&#xff0c;它是 python 的一个可视化工具&#xff0c;然后就想着结合微信来一起玩不多说&#xff0c;直接看效果&#xff1a;条形图.gif环境配置pip install pyechartspip install snapshot_seleniumpip install echarts-countries-pypkgpip …