博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
由Android屏幕旋转说起
阅读量:7172 次
发布时间:2019-06-29

本文共 1253 字,大约阅读时间需要 4 分钟。

hot3.png

简单来说,Activity作为负责与用户交互最主要的机制,任何的Configuration的变化都可能会对Activity的界面造成影响,这时系统会销毁Activity重新创建一个实例来反映最新的Configuration。比如今天要说的“屏幕旋转”,还有明天要说的“语言切换”。

在AndroidMainfest.xml文件中配置Activity时,会有这一属性android:screenOrientation="sensor"。绝大多数应用只会使用它的两个属性值,横向(lanscape)和 纵向(portrait)。横向一般的游戏APP和视频播放界面会使用比较大,而大多数情况下,我们程序员遇到的情况就是portrait了。前面的sensor,顾名思义,表示APP的屏幕方向由传感器决定,可以是横向,也可以是纵向。

但是如果在这里把android:screenOrientation属性设置为sensor,又不在代码中进行一定的控制,会出现不妙的情况。举个例子,用户正在这个页面填写表单,如果处理不当,用户会发现屏幕旋转后表单页面变空,这是非常影响用户体验的。再比如,我正在使用手机观看视频,屏幕旋转后会重新缓冲视频数据,同时重头播放,这是比较让人恼火的事情。我就曾经在我4.3系统的手机上遇到这种情况,搞了好久才解掉这个bug。

好了,背景介绍完毕。那现在说说我在遇到屏幕旋转时的三个解决方案吧。

第一种、禁止屏幕旋转

10230530_RgF1.jpg

第二种、旋转屏幕后恢复现场数据

我们可以在OnPause()方法中,先把数据存储到数据库或者Prefrence中,然后再在OnCreate()里面获取到。也可以使用下面两个简单的办法。

保存数据:

10230530_6XFu.jpg

重建现场:

10230530_8WcV.jpg

但是这一种方案在页面加载数据较多以及绘图操作比较频繁的情况下,是比较坑爹的。因为我们需要把原来辛辛苦苦加载出来的页面Destroy掉,重新来过。

最后一种方案:最简单的方案

看了以上的背景,那就有同学会问了,Android官方有没有提供这么一种方案呢,既能满足屏幕旋转的需求,又能不重新绘制页面。不用担心了,答案是肯定的,请相信万能的google吧。请见下图。

10230530_TbWI.jpg

但是这个最简单的方案照实把我给坑了一把,让我再一次见识到不同版本之间的碎片化的严重,话说上面我提到过的我的4.3机器。原先4.0之前,我们只须设置

android:configChanges="orientation|keyboardHidden"就能完成顺滑的切换。而在4.0系统之后呢,就需要新增一个screenSize属性值。就这一点的差异,还以为哪里出了问题,各种查,浪费了不少的时间。看到没有,就是如此的简单,就是如此的顺滑,我的视频播放页面也终于不那么坑了。

如果觉得对你有所帮助,欢迎大家订阅我的微信公众账号——Android干货分享。下面是微信的二维码,为你提供及时高质的Android干货。

转载于:https://my.oschina.net/jack1900/blog/289566

你可能感兴趣的文章
JavaScript的个人理解
查看>>
Java NIO下使用ByteBuffer读取文本时解决UTF-8概率性中文乱码的问题
查看>>
TypeScript 3.0 + React + Redux 最佳实践
查看>>
SpringMVC之源码分析--View(一)
查看>>
前端leader找我谈心:我是如何从刚毕业的前端菜鸟一步步成长为前端工程师的?...
查看>>
Ansible 学习指北
查看>>
2018年第19周-Presto概念(搭建过程)
查看>>
深入理解数据库锁
查看>>
CSSModules
查看>>
scrapy_redis 指定db
查看>>
underscore.js源码学习一(框架解读)
查看>>
Redis - Redisson vs Jedis
查看>>
腾讯云“云+校园扶持计划”1核2G1M服务器3年只需360元
查看>>
字串(数组)截取
查看>>
mysql百万数据实践-分区
查看>>
SpringBoot 整合 DWR ,实现 js 直接调用后端 Service
查看>>
利用webpack实现js/css模块化开发
查看>>
Parcel - 极速零配置Web应用打包工具
查看>>
【277天】跃迁之路——程序员高效学习方法论探索系列(实验阶段35-2017.11.09)...
查看>>
spring boot源码分析之springmvc(上)
查看>>