专栏首页安卓开发干货分享Android Q新特性,一起来学习折叠屏应该如何适配
原创

Android Q新特性,一起来学习折叠屏应该如何适配

/ 前言 /

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

/ 折叠屏适配 /

折叠屏之所以需要适配,是因为我们的应用有可能在运行的过程中,所在的屏幕尺寸发生了变化,这种情况对现有项目多少都会产生一些问题。

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

其实这种情况并不是折叠屏出现之后才有的,应用的纵向横向切换也会发生同样的情况,只不过很多应用都强制纵向,不需要处理这种适配了。

/ 允许改变应用尺寸 /

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

android:resizeableActivity="true" 

相反,如果暂时不打算适配,把这个参数设为 false 就好了。需要说明的是,这个参数在 Android 7.0 或更高版本默认为 true,以下则默认为 false。

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

/ 分屏模式 /

之所以从 Android 7.0 开始,把 resizeableActivity 默认改为 true,是因为在 7.0 里增加了一个新功能,叫分屏模式。

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

/ 兼容模式 /

当 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,充分利用大屏幕的显示空间,这是更进一步的优化做法了:

image

/ 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 是否获取到焦点。在失去焦点的时候可以不释放摄像头,但是需要处理好摄像头断开连接和重新连接的情况。

image

minAspectRatio

在 Android Q 之前只能配置最大支持比例 maxAspectRatio,现在 Android Q 可以配置最小支持比例 minAspectRatio 了, 用法和 maxAspectRatio 一样:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; font-size: inherit; color: inherit; line-height: inherit;">

<activity android:name=".MainActivity"

      android:maxAspectRatio="2.4"
      android:minAspectRatio="1"/> 

</pre>

最大最小支持比例,都是在 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。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ios系统未来有没有可能开源?

    苹果玩的就是闭环系统,现在苹果系统利润非常高,虽然现在苹果手机的风头已经没有当初那么风光了,但一个产品不可能数十年如一日的强大,因为现在竞争对手已经上来了,苹果...

    程序员互动联盟
  • IOS,安卓,Windows和塞班,你最喜欢哪个?为什么?

    从事软件开发多年,主要用C/C++,java三种编程语言开发,IOS,安卓,windows,塞班四个系统除了IOS没怎么玩过,其余三种系统都做过对应的开发,其中...

    程序员互动联盟
  • Android init language与init.rc初始化脚本

    参考: android源码目录里的system/core/init/readme.txt.

    morixinguan
  • 妈妈再也不用担心你不会使用线程池了

    Java 为我们提供了 ThreadPoolExecutor 来创建一个线程池,其完整构造函数如下所示:

    一觉睡到小时候
  • Android5.0 Recovery源代码分析与定制---recovery UI相关(二)

    这段代码都做了哪些事情呢?这些recovery初始化图形显示最开始的部分:(1)调用了miniui中的gr_init初始化显示图形相关的步骤,因为recover...

    morixinguan
  • 摄像头功能开发不再复杂,CameraX 助您轻松打造光影体验

    人们的生活正在被更及时、更多彩地记录与分享,智能手机的摄像头甚至能帮助用户深入解读他们眼前的世界,为他们实时提供翻译等帮助。但您也许不知道,超过 70% 的摄像...

    Android 开发者
  • 装饰者模式

    动态地将责任附加到对象上,若要拓展功能,装饰者提供了比继承更有弹性的替代方案对于设计模式。

    杨小杰
  • Linux 下Input系统应用编程实战

    什么是input子系统?不管是什么操作系统,都有一个程序是用于管理各种输入设备的,打个比方,生活中使用的电脑键盘、鼠标就是输入设备,小到日常生活中无可避免的智能...

    morixinguan
  • 微软打算重新拥抱安卓 弥补曾经4000 亿美元的错误

    6月27日消息,Microsoft信仰中心昨日发布微博称:微软打算重新拥抱安卓,即将发布的 Windows Lite 系统将引入安卓应用以及安卓应用商店支持,W...

    IT大咖说
  • PYPL 6 月 IDE 指数榜:IntelliJ 追上 Sublime Text

    PYPL 6 月的 IDE 指数榜单 Top IDE index 已经发布了,本月排名前 3 位的 IDE 与上个月相同,分别是 Visual Studio、E...

    一觉睡到小时候

扫码关注云+社区

领取腾讯云代金券