Android Studio 3.0中res目录下的mipmap-anydpi-v26是什么?

61
在Android Studio 3.0中,创建项目后,mipmap-anydpi-v26文件夹会自动创建在res目录中。它实际上是做什么的?为什么我们需要它?我们如何利用它进行开发?
此外,在项目设置后,该文件夹中还会自动创建两个XML文件。为什么这些XML文件位于mipmap文件夹中?我以为我们应该将所有XML文件放在drawable文件夹而不是mipmap文件夹中。

1
创建了哪些XML文件 - tyczj
在我的情况下,这个文件被创建了两次 --> res/mipmap-anydpi-v26/ic_launcher.xml - meyasir
https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive - Mohammad Afrashteh
3个回答

43

Android Studio 3会为你的应用程序创建一个自适应图标,该图标仅在SDK 26及以上版本中可用。启动器图标应放置在mipmap文件夹中。

如果您查看清单,可以看到它引用了ic_launcher

android:icon="@mipmap/ic_launcher"

如果你查看自己的mipmap文件夹,你会看到五个不同的启动器图标,它们将用于SDK版本26以下的任何应用。对于SDK版本26及以上,它使用来自anydpi-v26文件夹的XML文件来利用自适应图标。

<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@drawable/ic_launcher_background"/>
    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

1
这是否意味着你的“自适应图标”只需要提供一个图像大小,它就会根据当前dpi/分辨率进行自动调整,还是说这不是真的?如果是前者,在哪里物理上放置自适应图标成对的图像?如果是后者,这是否意味着我仍然需要将图像拆分为多个大小并将它们放置在各自的文件夹中?(请注意,我正在使用Unity3d,因此无法受益于Android Studio自动提供的内容)。 - vargonian
你仍然需要使用不同大小的图标,但它们应该放在相应dpi文件夹下的mipmap文件夹中。 - tyczj
谢谢。我仍然困惑为什么“drawable-”文件夹只是被看似等效的“mipmap-”文件夹所替换。不过,我已经让它工作了。 - vargonian
@vargonian https://android-developers.googleblog.com/2014/10/getting-your-apps-ready-for-nexus-6-and.html - tyczj
我的图标被边缘裁剪了。我想将其居中,但ic_launcher.xml没有提供这个功能。我将所有密度的图标放到相关文件夹中。但是ic_launcher.xml会裁剪我的图标,因此无法看到完整的图标。 - Hilal

20

以上两个答案都很好地概括了mipmap-anydpi-v26文件夹的作用,但我感觉缺少了为什么部分。以下是我的意见。

anydpi: 这些资源在任何dpi下优先使用。因此,即使您有与当前设备密度匹配的mipmap-hdpimipmap-mdpi,也会始终选择mipmap-anydpi中的资源。

anydpi-v26: 这是对任何dpi的附加过滤器。这表示只有在SDK/API级别为26或更高版本(Oreo)时,才始终从anydpi-v26中选择资源,而不管设备密度如何。

因此,您可以拥有mipmap-anydpi-v26或drawable-anydpi-v26。所有资源文件夹都遵循上述逻辑。

现在我们知道了“为什么使用mipmap-anydpi-v26”,让我们尝试理解为什么“mipmap-anydpi-v26/ic_launcher.xml”。

这是因为ic_launcher.xml用于描述应用程序的自适应图标,该图标仅在SDK 26及以上版本中可用,如其他答案所述。希望这可以帮助你。


4
似乎还有更多的问题。自从我改为仅支持v28及以上版本后,我将mipmap-anydpi-v26重命名为mipmap-anydpi - 但这搞砸了自适应图标。 - Martin

8
我找到了一个关于这个问题的解释,以下是一些背景信息:
要在 API 26 及以上设备上添加替换所有 PNG 的自适应图标,您需要添加一个名为 res/mipmap-anydpi-v26/ic_launcher.xml 的文件,其内容如下:
<adaptive-icon
    xmlns:android="http://schemas.android.com/apk/res/android">
  <background android:drawable="@drawable/ic_launcher_background"/>
  <foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

将它放置在 mipmap-anydpi-v26 文件夹中,资源系统会优先使用它,而不是其他 dpi 文件夹中的任何文件(这正是你想要的,因为该文件替换了所有其他文件),并且仅应在 API 26+ 设备中使用。


5
但是当我查看XML文件的内容时,它指向一个矢量图形代码块。说实话,我对矢量图形不太了解,并希望有人告诉我如何处理当前的PNG文件。由于我的图标有些复杂,目前生成矢量图形将需要很长时间,因此我该怎么办?请建议。 - Sri Krishna

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