对于可移动设备(手机、平板计算机等)来讲,用户可以根据实际的应用场景改变设备屏幕的方向。例如,当用户准备用手机看电影时,查找、浏览电影的信息通常使用纵向的屏幕方向,而观看电影时通常使用横向的屏幕方向。这时就需要通过代码控制屏幕的方向了。
通过setDisplayOrientation(DisplayOrientation orientaion)方法即可改变屏幕的方向,代码如下:
永久性地固定Page的屏幕方向非常简单,只需要在config.json中配置Page的orientation属性为landscape(横向显示)或portrait(纵向显示),但是,很多情况下,一个Page并不是在所有的情况下都需要保持一个方向。例如,播放视频时在未锁定屏幕的情况下可以改变屏幕方向,在锁定屏幕的情况下固定屏幕方向,那么在config.json中配置固定屏幕方向就不合适了。这种需求可以采用复写setDisplayOrientation(DisplayOrientation orientaion)方法实现,代码如下:
当isOrientationFixed变量为false时,屏幕方向可以随意改变;但是当isOrientationFixed变量为true时,屏幕方向将被固定为纵向。
屏幕方向变化时会引起设备配置的改变(Device Config Change),而设备配置的改变会引起Page的重建。设备配置包括屏幕密度、屏幕方向、屏幕尺寸、语言区域、字体显示大小等。显然,屏幕密度和屏幕尺寸在运行时几乎不会被改变,但是屏幕方向、语言区域等设备配置在运行时是可以被改变的。
设备配置改变后,当前Page就无法适应新的设备配置了,因此,在默认情况下应用程序可以将Page销毁并重建。这种方法显然最为简单,但是问题也最大:当前Page展示的数据和状态信息也通通被销毁了。
接下来用实例向大家解释一下。
在3.2.1节中的Lifecycle应用程序中,修改config.json中module对象下的deviceType,加入phone类型,使其支持手机设备,便于测试屏幕方向变化,代码如下:
在手机设备上运行应用程序,然后改变屏幕方向,此时在HiLog工具窗体中提示以下信息:
可以发现,在屏幕方向改变的过程中,MainAbility被销毁后重建了。
那么,如果开发者希望在屏幕方向改变后保留当前的Page数据和状态该怎么办呢?有两种方法:
· 不销毁重建Page。
· 销毁Page时保留临时数据,重建Page时读取临时数据。
接下来分别介绍这两种方法的实现方式:
1)不销毁重建Page
这种方法其实很简单,只需要在config.json中在当前的Ability的配置选项加入configChanges属性,并在其数组中加入orientation,代码如下:
重新运行程序,旋转设备并观察HiLog工具窗体,可以看出MainAbility不会被销毁后重建了。
2)销毁Page时保留临时数据,重建Page时读取临时数据
在Ability中,通过重写onStoreDataWhenConfigChange()方法存储临时数据,代码如下:
在Ability或AbilitySlice中,通过getLastStoredDataWhenConfigChanged()方法读取临时数据,代码如下: