Android Studio 图像资源启动器图标透明背景颜色

32
您可能认为这个问题是这个的副本。但从那以后,Android Studio已经更新,那里给出的解决方案不再有效。
我正在尝试使用Android Studio中的图像资源来设置我的应用程序标志。这是因为如果我将我的应用程序标志直接放在drawable或mipmap中,则会导致许多问题,例如:如果它的大小很大,则会发生应用程序崩溃,如果设备运行在oreo上,则标志将不会显示,而默认的ic_launcher正在显示等等。
在试图使用图像资源设置我的应用程序的标志时,我遇到了一个问题:我无法保持应用程序标志的背景透明。
我有一个在Photoshop中制作的png标志,我想将其设置为我的应用程序标志,并且我不想要任何背景,但是Android Studio的图像资源没有提供任何删除背景的选项。我尝试了来自谷歌的以下解决方案:

这个这个

但是这些都对我不起作用。
尝试过的解决方案:
  1. 将形状设置为none
  2. 通过从它的默认位置删除ic_launcher_background文件来删除
  3. 在不同的设备上尝试
这些都没有用...请帮帮我。任何帮助将不胜感激。

3
在背景层中再次导入相同的图像,并将其大小设置为小于第一张图像。 - Akram
4个回答

55
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或更低版本的其他遗留启动器图标可以恢复为透明的背景颜色。

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

STEP 1

在上方的左侧窗格中,以下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


更新 #1:

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

Home screen in Android 8.1 (Nexus 5X) Recents screen in Android 8.1 (Nexus 5X)


更新 #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

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

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

  • com.google.android.launcherGoogle Now Launcher
  • com.google.android.apps.nexuslauncherPixel Launcher

相比之下,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,并且现有的旧版图标成为其前景层。根据资源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_backgroundcolors.xml中定义。

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

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


那么,在Android 8.0及更高版本中,没有官方或巧妙的方法使应用程序图标具有透明背景? - Jaydip Kalkani
我仔细考虑了你的建议,并修改了我的答案。希望这对你有用。 - qtmfld
3
你的努力真棒,我点赞!我已经从mipmap-anydpi-v26中删除了一些资源,并正在尝试在Android 8.1版本的Nexus 5模拟器上运行我的应用程序,但输出结果仍然相同。我的logo是一个白色背景的圆形。顺便说一下,非常感谢你的大力支持。 - Jaydip Kalkani
感谢您的投票支持,并非常感激您提供的赏金。是的,您是对的。一些启动器应用程序可以为传统的启动器图标制作白色背景。我检查了当前AOSP启动器应用程序的源代码,并再次更新了我的答案。 - qtmfld
非常好的回答。无论如何,我还没有根据您的更新#2测试我的应用程序,但这是很好的解释。 - Jaydip Kalkani
显示剩余2条评论

20
在Android 5.0中,图标背景总是不透明的,除非我创建了一个透明文件。
1. 文件>新建>图像资产。 2. 转到“图标类型”中的“Launcher Icons(自适应和传统)”。 3. 在“资产类型”中选择“图像”,并在“路径”字段(前景层选项卡)中选择您的图片。 4. 创建或下载以下512x512像素大小的PNG文件,其中包含透明背景(这是“ic_launcher-web.png”的大小)。 5. 在“背景层”选项卡中,选择“图像”作为“资产类型”,并从步骤4加载透明背景。 6. 在“传统”选项卡中,对于所有“生成”,选择“是”,对于“形状”,选择“无”。 7. 在“前景层”和“背景层”选项卡中,可以更改修剪大小。
尽管在“预览”窗口中,您将看到图像后面有黑色背景,但在按下“下一步”,“完成”和编译应用程序后,您将在Android 5、Android 8中看到透明背景。 这里是透明图像:

enter image description here


2
不对...图标周围有黑色轮廓,看起来很奇怪。 - Shikhar
@ShikharJaiswal,这很奇怪。您能否发布一张图片并写下设备名称和操作系统版本? - CoolMind

9

尝试这种对我有效的方法:

  1. 首先,从Image Asset中创建一个适配性和传统的启动器图标: 选择一个背景层的image并将其调整大小为0%或1%,并且在传统选项卡中将shape设置为none

  2. 在项目窗口中删除文件夹res/mipmap/ic_laucher_round并打开AndroidManifest.xml文件,从application元素中删除属性android:roundIcon="@mipmap/ic_launcher_round"

  3. mipmap-anydpi-v26中删除ic_launcher.xml

注意:一些设备(如Nexus 5X(Android 8.1))会自动添加白色背景,并且无法进行任何更改。


1
如果我没理解错的话,您有一个512x512像素的Photoshop文件,想要从中制作logo以用于所有必要的文件夹(从mipmap-xxxhdpi到mipmap-mdpi)。您也可以在使用Android Studio创建图标后使用它。我更喜欢使用Photoshop来创建我的图标。我在创建一个512x512像素的图标后使用this site。您不仅可以为Android应用程序创建图标,还可以为iPhone应用程序和其他应用程序创建图标,而且它是免费的。图标被正确缩放,命名并放置在zip文件的android文件夹下的mipmap文件夹中。下载文件后只需解压缩并复制粘贴即可。我至少制作了50个图标,从未出现过问题。

你在使用这个网站制作图标后,是否尝试在装有Oreo系统的设备上测试了你的应用程序?它在Oreo系统中是否显示透明背景? - Jaydip Kalkani
在模拟器上是可以的。但我没有装有 Android 8.0 的实际设备。该网站生成的输出是 mipmap 文件夹和图标,就像您手动创建一样。它只是按比例缩放、重命名和创建所需的文件夹,而无需任何工作。 - Thracian
你会得到mipmap文件夹作为结果,不要将png文件保留在assets文件夹中。 - Thracian
不,它在奥利奥上不能完美地工作。当我在网站上上传了具有透明背景的PNG标志时,它显示白色背景。 - Jaydip Kalkani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接