Android 折叠屏适配攻略

随着三星 Galaxy Fold 和 华为 Mate X 的发布,折叠屏手机开始进入你们的视线。在改变手机体验的同时,也给咱们开发人员在适配方面带来了更多的挑战。本文给你们介绍一下 Android 开发中和折叠屏相关的一些概念,以及如何进行折叠屏的适配。android

折叠屏适配

折叠屏之因此须要适配,是由于咱们的应用有可能在运行的过程当中,所在的屏幕尺寸发生了变化,这种状况对现有项目多少都会产生一些问题。shell

因此折叠屏适配的本质是:当应用运行时,屏幕的尺寸、密度或比例发生了变化,应用可以继续在变化后的屏幕上正常显示和正常运行。bash

其实这种状况并非折叠屏出现以后才有的,应用的纵向横向切换也会发生一样的状况,只不过不少应用都强制纵向,不须要处理这种适配了。app

容许改变应用尺寸

要适配折叠屏,首先是要让应用支持动态改变尺寸,咱们须要在 menifest 中的 Application 或对应的 Activity 下声明:ide

android:resizeableActivity="true"
复制代码

相反,若是暂时不打算适配,把这个参数设为 false 就行了。工具

须要说明的是,这个参数在 Android 7.0 或更高版本默认为 true,如下则默认为 false。布局

下面介绍两个和这个参数相关的概念。测试

分屏模式

之因此从 Android 7.0 开始,把 resizeableActivity 默认改成 true,是由于在 7.0 里增长了一个新功能,叫分屏模式。优化

若是把 resizeableActivity 设为 false,就意味着应用是不支持分屏模式的,它决定了应用是否有分屏的设置项。ui

兼容模式

当 resizeableActivity 取 false 时,展开折叠屏可能会变成这样的效果:

这个效果相似于在 iPad 上使用不兼容的 iPhone 应用,这个四周用黑色填充的模式,叫兼容模式。

兼容模式的显示和最大支持比例 maxAspectRatio 有关,当屏幕比例超过 maxAspectRatio 时才会用黑边填充,官方建议把 maxAspectRatio 设为 2.4 (12 : 5),修改 maxAspectRatio 的方法以下:

  • Android 8.0 或以上版本

在 标签中配置 android:maxAspectRatio:

<activity android:name=".MainActivity" android:maxAspectRatio="2.4" />
复制代码
  • Android 8.0 如下版本

在 标签中添加名为 android.max_aspect 的 meta-data:

<meta-data android:name="android.max_aspect" android:value="2.4" />
复制代码

若是 resizeableActivity 设为 true,就不须要设置 maxAspectRatio 了,设了也不会生效。

监听尺寸改变

在默认状况下,当屏幕发生了变化,系统会销毁并从新建立整个 Activity。但咱们但愿屏幕变化以后,程序可以以切换前的状态继续运行,不须要重启页面。

咱们能够给 Activity 添加配置:

android:configChanges="screenSize|smallestScreenSize|screenLayout"
复制代码

这样配置后,当屏幕发生变化就不会重启 Activity 了,会调用到 onConfigurationChanged 方法,咱们能够在这个方法里获取到当前的屏幕信息:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    Log.i("config", "newConfig.screenHeightDp:" + newConfig.screenHeightDp
            + ", newConfig.screenWidthDp" + newConfig.screenWidthDp);
}
复制代码

这样改以后须要注意测试,看看页面的布局是否发生错乱,若是布局不合理就须要修改布局以适配不一样分辨率。

咱们也能够根据屏幕信息来更新布局,好比在大屏幕上把 LinearLayout 切换成 GridLayout,充分利用大屏幕的显示空间,这是更进一步的优化作法了:

Android Q

在即将到来的 Android Q 上,增长了一些支持折叠屏的特性。

Multi-resume

对于分屏模式,过去的分屏只支持两个应用同时显示,而大屏幕带来了更多的可能性,如今已经容许两个以上的应用同时显示了。

在 Android Q 以前的版本,以分屏模式运行的应用里面,只有获取到焦点的 Activity 会处于 onResume 状态,其余可见 Activity 都是处于 onPause 状态。

而在 Android Q 上,全部顶层可见 Activity 都处于 onResume 状态,保证在分屏模式下的可见 Activity 都能正常运行。但能获取到焦点的 Activity 依然只有一个,咱们把这个 Activity 叫作 TopResumedActivity。

在 Android Q 的 Activity 里增长了一个生命周期回调方法 onTopResumedActivityChanged(),它会在 Activity 获取或失去焦点时调用,能够用来判断当前 Activity 是否拥有焦点:

protected void onTopResumedActivityChanged(boolean topResumed) {
    if (topResumed) {
        // 获取到焦点
    } else {
        // 失去焦点
    }
}
复制代码

当咱们使用了独占资源时就要用到这个方法。什么叫独占资源?麦克风、摄像头就是,这类资源同一时间只能给一个 Activity 使用。

好比分屏模式下的多个 Activity 都使用了摄像头,但这时候只有获取到焦点的 Activity 拥有访问权限,这种状况下就要经过 onTopResumedActivityChanged() 判断当前 Activity 是否获取到焦点。在失去焦点的时候能够不释放摄像头,可是须要处理好摄像头断开链接和从新链接的状况。

minAspectRatio

在 Android Q 以前只能配置最大支持比例 maxAspectRatio,如今 Android Q 能够配置最小支持比例 minAspectRatio 了, 用法和 maxAspectRatio 同样:

<activity android:name=".MainActivity" android:maxAspectRatio="2.4" android:minAspectRatio="1"/>
复制代码

最大最小支持比例,都是在 resizeableActivity 取 false 的时候才会有用。

调试

最好的调试工具固然就是用真机了,但目前只有少部分人有这个条件,下面是真机之外的两个调试方案。

Android Studio

在 Android Studio 3.5 里增长了折叠屏设备的虚拟机,咱们能够建立一个来调试:

经过点击模拟器上的按钮,咱们能够切换虚拟机的折叠和展开状态:

命令行

咱们能够经过命令行动态修改手机分辨率,达到模拟折叠屏切换的效果,以 Mate X 的分辨率为例,咱们先使用命令行:

adb shell wm size 1148x2480
复制代码

手机分辨率将模拟为 1148x2480,这是 Mate X 折叠时的分辨率,这时再输入:

adb shell wm size 2200x2480
复制代码

将手机分辨率修改成 Mate X 展开后的分辨率 2200x2480,用这种方式模拟了折叠屏展开的切换。

你能够再次修改分辨率为 1148x2480,模拟屏幕折叠的切换。最后玩完了用下面命令行恢复手机自身分辨率:

adb shell wm size reset
复制代码

结束

关于折叠屏的适配,就介绍这么多。总的来讲,若是要适配折叠屏,第一步是把 resizeableActivity 设为 true,而后给 Activity 配置 configChanges,并进行测试。最后能够更近一步,给大屏幕设计另外一套 UI,在折叠屏切换时切换 UI。

下面是一些相关的参考资料:

相关文章
相关标签/搜索