窗口管理

本页介绍 Chrome 操作系统上的窗口管理器。

Chrome 操作系统上的窗口管理器

Android 应用分为以下几类:

API 级别 窗口管理器行为
Android 1.5(API 级别 3)及更低版本 这些应用始终显示为全屏模式。
Android 1.6(API 级别 6)到 Android 6.0(API 级别 23) 这些应用的大小调整被视为不安全。如果可能,这些应用默认情况下会在手机大小的纵向窗口中启动;否则,它们会在手机大小的横向窗口中启动。用户可以按 F4 键以进入或退出全屏模式,这样会完全重启应用(即终止再重新启动应用),并且从那时起会使应用保持纵向(或旋转为横向)全屏模式。
Android 7.0(API 级别 24)- 可调整大小 这是 Android 7.0 的默认行为:应用可调整大小而无需重启。默认情况下,这些应用启动时通常处于最大化状态。版本 M60 及更低版本的 Chromebook 默认情况下会启动手机大小 (Nexus 5X) 的纵向窗口。
Android 7.0(API 级别 24)- 不可调整大小 应用指定 android:resizeableActivity="false",以免调整其大小。不过,在某些情况下需要调整大小,例如,当用户改变屏幕尺寸时,当相应 Activity 在一个可调整大小的 Activity 之上时,或者当相应 Activity 改变方向时。
Android 7.0(API 级别 24)- 由应用控制 应用请求特殊的启动大小。

请注意,系统会记住诸如最大化或边界之类的应用状态。

根 Activity 规则

Chromebook 上的一个窗口由一堆 Activity 窗口组成。此堆栈中的每个窗口具有相同的大小和方向。

为避免突然的方向和大小变化(这会使桌面环境中的用户感到困惑),当使用并排模式时,Chromebook 上的窗口管理器与 Android 中的窗口管理器表现出相同的行为:

  • 堆栈底部的 Activity 决定了上面所有 Activity 的属性。这可能会导致意外情况:新启动的一个纵向不可调整大小的 Activity 可能会变为横向可调整大小。

设备模式作用如下:在平板电脑模式下,方向未锁定,并且每个方向决定了应用在 Android 上的正常方向。不过,如果 Activity 以 Android 6.0(API 级别 23)或更低版本为目标平台,则应用大小会锁定。

屏幕方向

最常见的屏幕方向是纵向,因为人们大多这样拿手机。这种模式对手机很合适,但对笔记本电脑却很糟糕。另一方面,横向模式既适合笔记本电脑,又适合平板电脑。要使用窗口管理器让您的应用呈现出最佳效果,您应考虑支持这两种屏幕方向。

某些 Android 应用假定,当设备处于纵向模式时,旋转值始终为 Surface.ROTATION_0。对于大多数 Android 设备而言,可能确实如此。不过,当应用处于某种 ARC 模式时,纵向的旋转值可能不是 Surface.ROTATION_0

要在读取加速度计或类似传感器的读数时获得准确的旋转值,请使用 Display.getRotation() 方法并相应地交换轴。如需详细了解如何设置屏幕方向,请下载 AccelerometerPlay 示例应用。

如果仅支持一种屏幕方向,请将该信息添加到清单中,以便窗口管理器在启动应用之前了解这一点。指定屏幕方向时,请确保尽可能指定传感器方向,因为 Chromebook 通常是可转换设备,而颠倒的应用很烦人。请坚持选定的屏幕方向,最重要的是:避免先在清单中请求一种屏幕方向,而后又以编程方式设置另一种屏幕方向。如果您根据窗口大小来改变屏幕方向,则可能会卡在小的纵向窗口中,用户将无法回到大的横向窗口中。

启动大小

应用可以通过以下某种方式来更改其启动大小:

  • 仅在桌面环境中使用启动大小。这有助于窗口管理器为您提供适当的边界和方向。要在桌面模式下使用时指明偏好设置,请在 <application> 标记内添加以下元标记:

    <meta-data android:name="WindowManagerPreference:FreeformWindowSize"
                   android:value="[phone|tablet|maximize]" />
        <meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
                   android:value="[portrait|landscape]" />
        
  • 使用静态启动边界。您可以使用 Activity 的清单条目内的 <layout> 来指定“固定”起始大小。请参见以下示例:

    <layout android:defaultHeight="500dp"
                android:defaultWidth="600dp"
                android:gravity="top|end"
                android:minHeight="450dp"
                android:minWidth="300dp" />
        
  • 使用动态启动边界。创建新的 Activity 时,Activity 可以创建和使用 ActivityOptions.setLaunchBounds(Rect)。通过指定一个空矩形,您的应用可以最大化。

全屏

这与原生 Android 上的工作方式一样:如果窗口未覆盖全屏,则对全屏显示(隐藏所有系统界面)的请求会被忽略。当应用最大化时,用于进入全屏模式的常规方法/布局/功能适用。这样,系统界面(窗口控制栏和任务栏)就会消失。