Android Studio Image Asset Launcher 图标透明背景色

新手上路,请多包涵

你可能会认为这个问题是 这个 问题的重复。但从那以后,Android Studio 已经更新,并且给出的解决方案不再有效。

我正在尝试使用 android studio 中的图像资产设置我的应用程序徽标。这是因为如果我将我的应用程序徽标直接放在 drawable 或 mipmap 中,则会导致许多问题,例如:如果它的大小很大,则会发生应用程序崩溃,如果设备在 oreo 上运行,则不会显示徽标,并且会显示默认的 ic_launcher 等。

在尝试使用图像资产设置我的应用程序徽标时,我遇到了一个问题:我无法使应用程序徽标的背景保持透明。

我有一个用 photoshop 制作的 png 徽标,我想将其设置为我的应用程序徽标,我不想要任何背景,但 android studio 图像资产不提供任何删除背景的选项。我尝试了谷歌的以下解决方案:

这个这个

但这些都不适合我。

尝试过的解决方案:

  1. 通过将形状设置为无
  2. 通过从默认位置删除 ic_launcher_background 文件
  3. 在不同的设备上试过

这些都不起作用…请帮助我。任何帮助将不胜感激。

原文由 Jaydip Kalkani 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
1 个回答

Android 8.0 Oreo(API 级别 26)引入了 自适应启动器图标,它由两层组成:前景和背景。 Material Design 指南 指出 _背景层在 Android O 及更高版本中必须是不透明的_,如您在以下引文底部所见。因此,如果您的应用的 targetSdkVersion 为 26 或更高版本,则适用于 Android 8.0 或更高版本的自适应启动器图标必须至少具有不透明背景色。

https://material.io/guidelines/style/icons.html#icons-icons-for-android

安卓图标

Android O 及更高版本

Android O 图标在设备的主屏幕和所有应用屏幕上代表您的应用。以下指南描述了图标如何获得独特的视觉处理、动画和行为。

图层规格

图标由两层组成:前景和背景。每一层都可以独立于另一层进行动画处理和接受处理。

前景(滚动视差)

  • 108 x 108 dp
  • 72dp 蒙版部分
  • 建议透明度(可选)

背景(微妙的视差)

  • 108 X 108 dp
  • 72dp 蒙版部分
  • 必须是不透明的

7.1 或更低版本的解决方法

尽管 8.0 或更高版本的启动器图标必须具有不透明背景色,但如果您可以从应用中省略 圆形启动器图标,则 7.1 或更低版本的其他旧版启动器图标可以恢复为透明背景色。

  1. 首先,创建 启动器图标(自适应和传统) 。它将创建自适应启动器图标和旧版启动器图标。一开始,它们都有不透明的背景颜色。
  2. 之后,创建 Launcher Icons (Legacy only) 。这将仅覆盖现有的旧启动器图标,如您在下面的第二个屏幕截图中所见。如果将 shape 设置为 none ,它们将具有透明背景色。
  3. 在项目窗口中删除文件夹 res/mipmap/ic_laucher_round
  4. 打开 AndroidManifest.xml 并从 application 元素中删除属性 android:roundIcon="@mipmap/ic_launcher_round"

步骤1

在上面的左侧窗格中,以下 XML 文件定义了适用于 Android 8.0 或更高版本的自适应启动器图标。

  • mipmap-anydpi-v26/ic_launcher.xml
  • mipmap-anydpi-v26/ic_launcher_round.xml

如右侧窗格中所示,它们引用以下可绘制 XML 文件。

  • 可绘制/ic_launcher_background.xml
  • drawable-v24/ic_launcher_foreground.xml

第2步


更新#1:

在 Android 8.0 或更高版本中,启动器图标的背景颜色可以是透明的,如 Android 8.1 (Nexus 5X) 屏幕截图所示。示例应用程序“NoAdaptive”在文件夹 mipmap-anydpi-v26 中没有自适应启动器图标的任何资源,而另一个应用程序“自适应”具有资源。

Android 8.1 (Nexus 5X) 中的主屏幕Android 8.1 (Nexus 5X) 中的最近屏幕


更新#2:

虽然启动器图标的背景颜色在 Android 8.0 或更高版本中可以是透明的,但这取决于用户的启动器应用程序。一些启动器应用程序会将您的旧图标转换为不透明的自适应图标。

在 Nexus 5X 设备 (Android 8.1)

根据其包名称 com.google.android.launcher ,默认启动器应用程序是 Google Now Launcher 。背景颜色可以是透明的,如更新 #1 的屏幕截图所示。

在 Nexus 5 模拟器 (Android 8.1)

根据其包名称 com.google.android.apps.nexuslauncher ,默认启动器应用程序是 Pixel LauncherRecents 屏幕的背景颜色可以是透明的,如下截图所示:

  • 屏幕不透明
  • 在“ 最近” 屏幕中透明
  • 所有应用程序 屏幕中不透明

Nexus 5 模拟器中的 Home、AllApps 和 Recents 屏幕

某些启动器应用程序中的不透明白色背景

这些 GMS 应用程序是闭源的:

  • com.google.android.launcher Google 即时启动器
  • com.google.android.apps.nexuslauncher 像素启动器

相比之下, AOSP 应用程序 是开源的。 Android 中的大多数启动器应用程序都基于以下启动器应用程序的源代码:

  • com.android.launcher
  • com.android.launcher2
    • Launcher2(原包名)
  • com.android.launcher3
    • Launcher3 (适用于 Android 5.0 Lollipop 或更高版本)

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_TREATMENTFeatureFlags.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 创建一个新的自适应启动器图标,并且现有的旧版图标成为其前景层。背景层是一个可绘制对象: @color/legacy_icon_background ,根据 资源 XML 文件

 <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_backgroundcolors.xml 中定义

<color name="legacy_icon_background">#FFFFFF</color>

因此,背景颜色变为白色。

原文由 qtmfld 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏