最近各大厂商都出现了折叠屏手机,就在下月华为mateX折叠屏即将上市,华为SGA群里的小姐姐不停的催我们去适配。
emmm ~~这个挺重要,给适配了,但是中间爬过了一个坑,关于这个问题我们会在具体步骤中说一下,我们先看一下文档中的内容
目录
配置参数
文档我已经上传了可以在我的资源中找到
这个是文档的基本信息,第一版本
在这里我们只说一下具体的代码部署,至于UI尺寸、界面排版策略、以及界面的状态栏等文档中有的问题,大家可以下载一下这个文档,看一下更详细的信息,这里就不一一叙述:
我们的首先要解决的问题是当屏幕的项目发生改变时,activity的生命周期不会重新走,所以我们要进行一系列的配置
1、在应用界面能够不同的屏幕尺寸下铺满全屏显示,且响应布局和操作按键功能正常
<application android:resizeableActivity=["true" | "false"] />
2、申请最大比例与最小比例
<activity android:maxAspectRatio="2.4" android:minAspectRatio="1.0">
maxAspectRatio 在7.1之后的版本中需要在Activity中设置,建议2.4,可以适配最大比例
minAspectRatio在Q版本(1.0)开始,在activity中设置,可以铺满屏幕
要强调的一点,如果在activity中设置minAspectRatio,需要目标版本targetSdkVersion最小为29
android {
defaultConfig {
targetSdkVersion 29
}
}
maxAspectRatio需要目标版本最小为26,不过为了适配1.0的minAspectRatio属性,最好直接用29
其他版本需要在application中使用<mate-data>标签设置
<application> <!--Android 7.1 及以下版本,在 manifest 文件的<application>节点中增加 <meta-data> android.max_aspect数据,设置最大支持比例: https://blog.csdn.net/QQ729533020/article/details/99740128 适配折叠屏 2.4为最大支持比例 可在折叠屏展开状态下铺满 注:之前值为2.1 暂时直接改为2.4 出现问题适配问题时另说。 2.4 可用于大部分屏幕--> <meta-data android:name="android.max_aspect" android:value="2.4" /> <!-- Q 之前版本:在 manifest 文件的 <application>节点中增加 <meta-data>数据,设置最小支持比例(声明为 1.0 即表示在展开态大屏下满屏显示) https://blog.csdn.net/QQ729533020/article/details/99740128 适配折叠屏--> <meta-data android:name="android.min_aspect" android:value="1.0" /> </application>
虽然安卓提供了申请受限屏幕能力,还是强烈建议您设计resizeable能力,一旦 您申明了受限屏幕比例(最大或最小)这意味着,当您的app运行在一个屏幕比例超出了您 申明的范围,您的应用程序在屏幕上将出现黑边等现象。
3、接下来就是最重要的一步 configchanges的配置(这将禁止页面重走生命周期,如果需要重新走,请直接看第四步)
折叠展开的动作,会触发对smallestscreensize、screensize和screenlayout的配置更改。每 当发生配置更改时,默认情况下会销毁并重新创建整个activity。
<activity android:configChanges="screenSize|smallestScreenSize|screenLayout" />
以上是官方给出的几个参数,但是会有一些特殊的,容易忽略的情况,就是你会发现你设置了以上属性时,当屏幕分辨路发生变化,activity生命周期仍然会重新走一遍,大概率引发空指针错误,这是我在适配的时候遇到的遇到的一个坑(我用的是华为mate10 通过adb命令测试的)!
于是我又加上了几个参数
android:configChanges="keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout|fontScale|touchscreen"
以上是我的配置,需要提醒大家的是,因为开发过程中可能会因为自己的某些配置,导致在屏幕分辨率发生变化的时候,会出发触摸事件以及字体变化等,需要大家自己去摸索着里面的参数,如果以上参数还不起作用,可以继续添加参数
“mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
“mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
“locale“ 所在地区发生变化。
“touchscreen“ 触摸屏已经改变。(这不应该常发生。)
“keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。
“keyboardHidden“ 用户打开手机硬件键盘
“navigation“ 导航型发生了变化。(这不应该常发生。)
“orientation“ 设备旋转,横向显示和竖向显示模式切换。
“fontScale“ 全局字体大小缩放发生改变
给大家推荐一个链接 android:configChanges属性总结 ,里面有每个属性具体的解释
ok,设置的差不多了,然后就是需要在屏幕分辨率发生变化的时候,进行一系列操作,需要重写 onConfigurationChanged() 方法,通过该方法的 Configuration 参数获得 屏幕的分辨率等信息,就可以针对不同比例屏幕下的应用界面布局做相应调整,如切换布局、调整控件位置和间距等。这个方法在Activity以及Fragment中都会有。
4、如果应用必须进行重新走生命周期来以响应屏幕切换,需要进行状态的保存和恢 复。
可以通过OnSaveInstanceState()和ViewModel对象来进行之前状态保存和后续的恢 复。即,在销毁activity之前,通过onSaveInstancesState()存储状态, 在onCreate() or onRestoreInstanceState()进行状态的恢复。
文档中也强调了
Note:不要在OnDestroy()中调用finish()或其他自行终止进程。这将导致应用程序在设备折叠或展开时关闭、闪退等问题。
关于多窗口开发这里简单的说一下几个问题,详细的大家可以看文档,里面有介绍
Android的多窗口开发指导(可以点击下载)
1、正确处理应用的横竖屏
其实“竖屏”真正的意义仅仅是高度大于宽度,“横屏”的意义是宽度大于高度。2、所以从这个定义来考虑,在应用调整大小时,可能会从一个朝向转到另一个朝向就 说得通了。
在多窗口模式下在运行时锁定朝向的
➡️setRequestedOrientation()、android:screenOrientation()方法都是无效的。
2、正确处理Activity的Pause状态
Q版本之前,手机系统中只有一个resumed activity,一个focus activity,用户仍可以看
到处于pause状态的应用,应用在暂停状态下可能仍需要继续操作。例如处于pause状态但 可见的视频应用应继续播放。
Q版本后,Android允许multi resumed activity出现,并不是仅有一个resumed activity。
接下来就是最最重要的调测工具目前 实体机还没上市,但是从Android Studio 3.5 Canary版本开始,开发者可创建一个运行Q Beta 2版本的折叠屏虚拟设 备,其支持的硬件配置分别为7.3英寸(折叠后为4.6英寸),以及8英寸(折叠后为6.6英寸)。 建议开发者选择8英寸的设备来模拟适配华为的MateX折叠屏手机(备注:Android Studio 3.5 Canary版本下载地址)
如果不想这么麻烦的去更新我们的开发工具,可以使用adb命令去更改我们的手机的像素达到模拟折叠屏像素的改变的过程,
需要注意一点, 有直接去恢复像素的adb命令,但是可能会引起手机字体大小的改变,重启机器也无法改变。
怎么办呢?大家先看一下手机的设置 ➡️ 显示 ➡️ 屏幕分辨率,可不可以改变手机分辨率,如果有的话,如果adb reset 命令没有恢复字体大小,可以在这儿去切换一下分辨率,在切换回来,字体大小就恢复了
通过命令模拟调试
开发者也可以在非折叠屏手机上面通过命令修改手机的屏幕分辨率来进行模拟调试:
1. 折叠切展开模拟方法:
1) 预先将手机设置主屏分辨率:
adb shell wm size 1148x2480
2) 通过修改手机分辨率为全屏分辨率模拟状态切换:
adb shell wm size 2200x2480
2. 展开切折叠模拟方法:
1) 预先将手机设置全屏分辨率:
adb shell wm size 2200x2480
2) 通过修改手机分辨率为主屏分辨率模拟状态切换:adb shell wm size 1148x2480
3. 分辨率恢复方法:adb shell wm size reset
喜欢就点个赞吧~?
注:OPPO折叠屏需要跟厂商沟通添加白名单,否则会有屏幕方向异常问题