支持桌面窗口

桌面窗口功能使用户能够在可调整大小的应用程序窗口中同时运行多个应用程序,从而提供多功能的类似桌面体验。

在图 1 中,您可以看到启用桌面窗口功能后屏幕的组织方式。需要注意的事项

  • 用户可以并排同时运行多个应用程序。
  • 任务栏位于显示屏底部固定位置,显示正在运行的应用程序。用户可以固定应用程序以快速访问。
  • 新的可自定义标题栏装饰每个窗口的顶部,并提供最小化和最大化等控件。
图 1. 平板电脑上的桌面窗口功能。

默认情况下,应用程序在 Android 平板电脑上全屏打开。要在桌面窗口功能中启动应用程序,请按住屏幕顶部的窗口手柄并拖动手柄在 UI 中移动,如图 2 所示。

当应用程序在桌面窗口功能中打开时,其他应用程序也会在桌面窗口中打开。

图 2. 按住并拖动应用程序窗口手柄以进入桌面窗口功能。

用户还可以从在点击或单击手柄时显示在窗口手柄下方的菜单中调用桌面窗口功能,或使用键盘快捷键Meta 键 (Windows、Command 或 Search) + Ctrl + 下箭头

用户可以通过关闭所有活动窗口或通过抓住桌面窗口顶部的窗口手柄并将应用程序拖动到屏幕顶部来退出桌面窗口功能。Meta + H 键盘快捷键也会退出桌面窗口功能并再次以全屏模式运行应用程序。

要返回到桌面窗口功能,请点击“最近使用的应用”屏幕中的桌面空间磁贴。

可调整大小和兼容性模式

在桌面窗口功能中,方向锁定应用程序可以自由调整大小。这意味着即使活动锁定为纵向方向,用户仍然可以将应用程序调整为横向方向窗口。

图 3. 将纵向受限应用程序的窗口调整为横向。

声明为不可调整大小(即 resizeableActivity = false)的应用程序会缩放其 UI,同时保持相同的纵横比。

图 4. 不可调整大小应用程序的 UI 会随着窗口调整大小而缩放。

对于锁定方向或声明为不可调整大小的相机应用程序,其相机取景器有特殊处理:窗口可以完全调整大小,但取景器会保持相同的纵横比。通过假设应用程序始终以纵向或横向运行,应用程序会硬编码或以其他方式做出导致预览或捕获图像方向或纵横比计算错误的假设,从而导致图像拉伸、侧向或倒置。

在应用程序准备好实现完全响应式相机取景器之前,特殊处理提供了更基本的用户体验,可以减轻错误假设可能造成的影响。

要了解有关相机应用程序兼容性模式的更多信息,请参阅设备兼容性模式

图 5. 随着窗口调整大小,相机取景器会保持其纵横比。

可自定义标题栏内边距

在桌面窗口功能中运行的所有应用程序都具有标题栏,即使在沉浸模式下也是如此。
确保应用程序内容不会被标题栏遮挡。标题栏是一种标题栏内边距类型:androidx.compose.foundation.layout.WindowInsets.Companion.captionBar();在视图中,WindowInsets.Type.captionBar(),它是系统栏的一部分。

您可以在在应用程序中显示边缘到边缘的内容并在 Compose 中处理窗口内边距中了解更多关于处理内边距的信息。

标题栏也可以自定义。Android 15 引入了外观类型APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND,使标题栏透明,以便应用程序可以在标题栏内绘制自定义内容。

然后,应用程序负责为其内容的顶部部分设置样式,使其看起来像标题栏(背景、自定义内容等),但系统标题元素(关闭和最大化按钮)除外,这些元素由系统在透明标题栏上方的应用程序上绘制。

应用程序可以使用APPEARANCE_LIGHT_CAPTION_BARS切换标题栏内系统元素的外观(亮色和暗色主题),类似于切换状态栏和导航栏的方式。

Android 15 还引入了WindowInsets#getBoundingRects()方法,使应用程序能够更详细地检查标题栏内边距。应用程序可以区分系统绘制系统元素的区域和应用程序可以在其中放置自定义内容而不会与系统元素重叠的未利用区域。

API 返回的Rect对象列表指示应避免的系统区域。任何剩余的空间(通过从标题栏内边距中减去矩形来计算)都是应用程序可以在其中绘制而不会与系统元素重叠并能够接收输入的空间。

Chrome before and after implementing custom headers.
图 6. Chrome 在实现自定义标题之前和之后。

多任务处理和多实例支持

多任务处理是桌面窗口功能的核心,允许应用程序的多个实例可以极大地提高用户的工作效率。

Android 15 引入了PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI,应用程序可以将其设置为指定应为应用程序显示系统 UI,以允许将其启动为多个实例。

使用拖动手势管理应用程序实例

在多窗口模式下,用户可以通过将视图元素从应用程序窗口中拖出以启动新的应用程序实例。用户还可以将元素在同一应用程序的不同实例之间移动。

图 7. 通过将选项卡从桌面窗口中拖出以启动 Chrome 的新实例。

Android 15 引入了两个标志来自定义拖放行为

图 8. 在 Chrome 应用程序的两个实例之间移动选项卡。

其他优化

自定义应用程序启动并从桌面窗口功能过渡到全屏。

指定默认大小和位置

并非所有应用程序(即使是可调整大小的应用程序)都需要大型窗口才能提供用户价值。您可以使用ActivityOptions#setLaunchBounds()方法在启动活动时指定默认大小和位置。

从桌面空间进入全屏

应用程序可以通过调用Activity#requestFullScreenMode()进入全屏模式。该方法直接从桌面窗口功能显示应用程序全屏。