android.max_aspect meta 有什么不同?

Where does android.max_aspect meta make difference?

最近的一篇blog说明我们必须使用

<meta-data android:name="android.max_aspect" android:value="2.1" />

AndroidManifest.xml<application> 元素中用于在超宽屏设备上的最佳显示,例如三星盖乐世 S8。

为了对此进行测试,我在 Android 7.1.1 上安装了我的应用程序(没有 max_aspect,没有 resizeableActivity 标志;targetSdkVersion=22compileSdkVersion=24)。具有自定义 2960x1440 分辨率的模拟器。如博客 post.

中所示,所有活动(包括身临其境)都会无边距地填满屏幕。

我添加了显式

<meta-data android:name="android.max_aspect" android:value="1.5" />

这对模拟器也没有影响。

所以,问题是:这个元标志是只在真实设备上检查过的,还是我的模拟器有一些配置遗漏了?

更新: 我试图联系到引用博客 post 的作者 Neto Marin。我为他对全球 Android 开发社区的贡献感到自豪 tweet ,但无法从他那里得到答案。

只有当您的 android:resizeableActivity 不正确时,android.max_aspect 才会有所不同。 如果您的应用程序的目标 API 是 24 或更高 android:resizeableActivity 设置为 true。

Note: You do not need to set a maximum aspect ratio if an activity's android:resizeableActivity attribute is set to true. If your app targets API level 24 or higher, this attribute defaults to true. For more information, see Configuring your app for multi-window mode.

请参考documentation

您必须根据需要设置模拟器的纵横比。

试试这些步骤:

In Android Studio, open AVD Manager
Create Virtual Device
    New Hardware Profile
    Set name: "18:9 aspect ratio screen"
    Set resolution: 1080 x 2160
    Finish
Select "18:9 aspect ratio screen"
Next
Select system image Nougat (API Level 25)
Next
AVD Name: "API Level 25 Nougat 18x9 aspect ratio screen"
Finish

然后运行在此模拟器上。

如果您没有设置值,并且 android:resizeableActivity 不正确,则最大宽高比默认为 1.86(大约 16:9)并且您的应用将不会利用额外的屏幕 space.

如果 activity 的 android:resizeableActivity 属性设置为 true,则无需设置最大纵横比。如果您的应用面向 API 级别 24 或更高级别,则此属性默认为 true。

Letterboxing 出现在不同的设备上,例如 Samsung S8、LG G6, Pixel 2 XL 和其他一些设备。它似乎是 Android 8 的一部分,尤其是 8.1。

官方Android 8.1 compatibility definition包含以下段落:

[C-0-1] Device implementations with the Configuration.uiMode set as UI_MODE_TYPE_NORMAL MUST have an aspect ratio value between 1.3333 (4:3) and 1.86 (roughly 16:9), unless the app can be deemed as ready to be stretched longer by meeting one of the following conditions:

  • The app has declared that it supports a larger screen aspect ratio through the android.max_aspect metadata value.
  • The app declares it is resizeable via the android:resizeableActivity attribute.
  • The app is targeting API level 26 or higher and does not declare a android:MaxAspectRatio that would restrict the allowed aspect ratio.

注意前两个属性是应用级别的,后一个属性属于Activity.

一些供应商允许最终用户对此进行进一步控制。 LG 在 "Display" 设置上有 "App Scaling" menu; Samsung lets you choose "full screen apps"。