Android 8.0 Oreo (API level 26)引入了
自适应启动器图标,由前景层和背景层组成。
材料设计指南规定
在Android O及以上版本中,背景层必须是不透明的,如下引用底部所示。因此,如果您的应用程序的
targetSdkVersion为26或更高版本,则Android 8.0或更高版本的自适应启动器图标至少必须具有不透明的背景颜色。
https://material.io/guidelines/style/icons.html#icons-icons-for-android
Android图标
Android O及以上版本
Android O图标用于在设备的主屏幕和所有应用程序屏幕上表示您的应用程序。以下准则描述了如何使图标获得独特的视觉效果、动画和行为。
...
图层规范
图标由两个图层组成:前景和背景。每个图层可以独立地进行动画和处理。
前景(滚动视差)
- 108 x 108 dp
- 72dp遮罩区域
- 建议使用透明度(可选)
背景(更细微的视差)
- 108 X 108 dp
- 72dp遮罩区域
- 必须不透明
7.1或更低版本的解决方法
尽管8.0或更高版本的启动器图标必须具有不透明的背景颜色,但如果您可以省略应用程序中的round launcher icons,则7.1或更低版本的其他遗留启动器图标可以恢复为透明的背景颜色。
- 首先,创建启动器图标(自适应和遗留)。这将创建自适应启动器图标和遗留启动器图标。它们最初都具有不透明的背景颜色。
- 之后,创建启动器图标(仅限遗留)。这将仅覆盖现有的遗留启动器图标,如下面第二张截图所示。如果将
shape
设置为none
,它们将具有透明的背景颜色。
- 在项目窗口中删除文件夹
res/mipmap/ic_laucher_round
。
- 打开AndroidManifest.xml并从
application
元素中删除属性android:roundIcon="@mipmap/ic_launcher_round"
。
![STEP 1](https://istack.dev59.com/kiDLo.webp)
在上方的左侧窗格中,以下XML文件定义了适应性启动器图标,适用于Android 8.0或更高版本。
- mipmap-anydpi-v26/ic_launcher.xml
- mipmap-anydpi-v26/ic_launcher_round.xml
如右侧面板所示,它们引用以下可绘制的XML文件。
- drawable/ic_launcher_background.xml
- drawable-v24/ic_launcher_foreground.xml
![STEP 2](https://istack.dev59.com/Hqpgj.webp)
更新 #1:
在 Android 8.0 或更高版本中,启动器图标的背景颜色可以是透明的,如 Android 8.1(Nexus 5X)的屏幕截图所示。示例应用程序“ NoAdaptive”在文件夹mipmap-anydpi-v26
中没有自适应启动器图标的任何资源,而另一个应用程序“ Adaptive”有该资源。
![Recents screen in Android 8.1 (Nexus 5X)](https://istack.dev59.com/LVFw6.webp)
更新 #2:
尽管在Android 8.0或更高版本中,启动器图标的背景颜色可以是透明的,但这取决于用户使用的启动器应用。一些启动器应用会将您的传统图标转换为不透明的自适应图标。
在Nexus 5X设备(Android 8.1)中
默认的启动器应用是Google Now Launcher,根据其包名com.google.android.launcher
。背景颜色可以是透明的,就像更新 #1 的截图中一样。
在Nexus 5模拟器(Android 8.1)中
默认的启动器应用是Pixel Launcher,根据其包名com.google.android.apps.nexuslauncher
。在最近使用屏幕中,背景颜色可以是透明的,就像下面的截图中一样:
- 主屏幕中是不透明的
- 最近使用屏幕中是透明的
- 所有应用屏幕中是不透明的
![Home, AllApps and Recents screens in Nexus 5 emulator](https://istack.dev59.com/DljpU.webp)
某些启动器应用程序中的不透明白色背景
这些GMS应用程序是闭源的:
com.google.android.launcher
Google Now Launcher
com.google.android.apps.nexuslauncher
Pixel Launcher
相比之下,AOSP应用程序是开源的。Android中的大多数启动器应用程序都基于以下启动器应用程序的源代码:
com.android.launcher
com.android.launcher2
com.android.launcher3
Launcher3源代码
在Launcher3的git分支
oreo-release中,
LauncherIcons.java有一个方法
wrapToAdaptiveIconDrawable
,用于将传统的启动器图标包装成自适应启动器图标。
/**
* If the platform is running O but the app is not providing AdaptiveIconDrawable, then
* shrink the legacy icon and set it as foreground. Use color drawable as background to
* create AdaptiveIconDrawable.
*/
static Drawable wrapToAdaptiveIconDrawable(Context context, Drawable drawable, float scale) {
if (!(FeatureFlags.LEGACY_ICON_TREATMENT && Utilities.isAtLeastO())) {
return drawable;
}
try {
if (!(drawable instanceof AdaptiveIconDrawable)) {
AdaptiveIconDrawable iconWrapper = (AdaptiveIconDrawable)
context.getDrawable(R.drawable.adaptive_icon_drawable_wrapper).mutate();
FixedScaleDrawable fsd = ((FixedScaleDrawable) iconWrapper.getForeground());
fsd.setDrawable(drawable);
fsd.setScale(scale);
return (Drawable) iconWrapper;
}
} catch (Exception e) {
return drawable;
}
return drawable;
}
标志FeatureFlags.LEGACY_ICON_TREATMENT
在FeatureFlags.java中定义:
// When enabled, icons not supporting {@link AdaptiveIconDrawable} will be wrapped in this class.
public static final boolean LEGACY_ICON_TREATMENT = true
因此,旧版启动器图标的背景颜色取决于这个标志,并且在某些启动器应用程序(如Pixel Launcher)中可以是不透明的。
背景颜色
如果将标志设置为true
,则会创建一个新的自适应启动器图标,其中包含R.drawable.adaptive_icon_drawable_wrapper
,并且现有的旧版图标成为其前景层。根据资源XML文件,背景层是一个可绘制对象:@color/legacy_icon_background
:
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/legacy_icon_background"/>
<foreground>
<com.android.launcher3.graphics.FixedScaleDrawable />
</foreground>
</adaptive-icon>
颜色legacy_icon_background
在colors.xml中定义。
<color name="legacy_icon_background">#FFFFFF</color>
因此,背景颜色变为白色。