Mipmap drawables图标

时间:2014-05-29 14:29:26

标签: android android-drawable mipmaps

从Android 4.3(Jelly Bean)开始,我们现在可以使用res/mipmap文件夹存储" mipmap"图像。

例如, Chrome for Android 将其图标存储在这些文件夹中,而不是更常规的res/drawable文件夹中。

这些mipmap图像与其他熟悉的可绘制图像有何不同?

我在清单中看到,我们使用@mipmap/限定符,而不是@drawable/,这对于资源文件夹名称是有意义的:

<activity
    android:name=".MipmapDemp"
    android:icon="@mipmap/ic_launcher" />

参考文献:

Android 4.3 APIs文件有如下说法:

  

使用mipmap作为位图或drawable的源代码很简单   提供高质量图像和各种图像尺度的方法,可以   如果您希望在图像期间缩放图像,这将非常有用   动画。

     

Android 4.2(API级别17)在位图中添加了对mipmap的支持   class-Android在您提供的位图中交换mip图像   一个mipmap源并启用了setHasMipMap()。现在在Android 4.3中,   您也可以通过以下方式为BitmapDrawable对象启用mipmap   提供一个mipmap资源并在一个。中设置android:mipMap属性   位图资源文件或通过调用hasMipMap()。

我在那里看不到有助于我理解的任何内容。


XML Bitmap resources有一个android:mipMap属性:

  

布尔值。启用或禁用mipmap提示。请参阅setHasMipMap()   更多信息。默认值为false。

就我所见,这不适用于启动器图标。


问题出现在Google网上论坛( The purpose of resource name "mipmap"?! )上,Romain Guy回复道:

  

以更大的分辨率提供图像会很有用   通常是计算的(例如,在mdpi设备上,Launcher可能会   想要更大的hdpi图标来显示大型应用程序快捷方式。)

我觉得这几乎是有道理的,但并不完全。

我仍然倾向于选择Randy Sugianto的跟进:

  

这有什么好处?有没有指导如何使用   mipmap,可能是为了更好的发射器图标?


当然,Wikipedia has a page for "Mipmap"指的是1983年发明的旧技术,我可以与当前的Android实现相关联。


这些天我们是否应该将所有应用图标存储在res/mipmap个文件夹中,以及这些mipmap图像的指南是什么?


更新#1

这是一篇试图解释它的博客文章。

但是该博客文章中使用的图像显示的是一个包含许多徽标的文件。这不是我在Chrome的mipmap文件夹中看到的。

Chrome的mipmap-hdpi文件夹包含三张图片。一个是Chrome徽标,单独使用。

Chrome mipmap-hdpi icon.png

奇怪的是,它是72x72,而不是我期望看到的48x48。

也许这就是全部 - 我们只需要在mipmap文件夹中保留更大的图标?


更新#2

2014年10月23日的Android开发者博客文章再次确认了将mipmap文件夹用于应用程序图标的想法:

在谈到Nexus 6屏幕密度时,作者写道:

  

最佳做法是将应用程序图标放在mipmap文件夹中(而不是   drawable-文件夹)因为它们的使用分辨率不同于   设备的电流密度。例如,xxxhdpi应用程序图标可以是   在启动器上用于xxhdpi设备。


更新#3

请注意,Android Studio会在ic_launcher.png文件夹中创建mipmap...图标,而不是Eclipse用于创建它们的drawable...文件夹。


11 个答案:

答案 0 :(得分:249)

mipmap有两种不同的用途:

  1. 用于构建密度特定APK时的启动器图标。一些开发人员为每个密度构建单独的APK,以保持APK大小。但是,某些发射器(随某些设备一起提供,或在Play商店中提供)使用比标准48dp更大的图标尺寸。启动器使用getDrawableForDensity并在需要时缩小,而不是向上缩小,因此图标质量很高。例如,在hdpi平板电脑上,启动器可能会加载xhdpi图标。通过将启动器图标放在mipmap-xhdpi目录中,在为hdpi设备构建APK时,它不会像drawable-xhdpi目录那样被剥离。如果您要为所有设备构建单个APK,那么这并不重要,因为启动器可以访问可绘制资源以获得所需的密度。

  2. 4.3中的实际mipmap API。我没有使用它,我不熟悉它。它没有被Android开源项目发射器使用,我也不知道有任何其他发射器使用。

答案 1 :(得分:76)

似乎Google已经更新了他们的文档,因为所有这些答案,所以希望这将在未来帮助其他人:)在创建一个新的(新的)项目时,我自己遇到了这个问题。

TL; DR:drawables可能会被剥离,作为特定于dp的资源优化的一部分。 Mipmap不会被剥离。

  

不同设备上的不同主屏幕启动器应用程序以各种分辨率显示应用启动器图标。当应用资源优化技术移除未使用的屏幕密度的资源时,启动器图标可能会变得模糊,因为启动器应用程序必须升级较低分辨率的图标以供显示。为避免出现这些显示问题,应用应使用mipmap/资源文件夹作为启动器图标。无论密度剥离如何,Android系统都会保留这些资源,并确保启动器应用程序可以选择具有最佳分辨率的图标进行显示。

(来自http://developer.android.com/tools/projects/index.html#mipmap

答案 2 :(得分:27)

  

这些mipmap图像与其他熟悉的可绘制图像有何不同?

这是我试图解释差异的两分钱。在Android中处理图像时,有两种情况需要处理:

  1. 您希望为设备密度加载图像,并且您将“按原样”使用它,而不更改其实际尺寸。在这种情况下,您应该使用 drawables ,Android将为您提供最佳图像。

  2. 您希望为设备密度加载图片,但此图片将按比例放大或缩小。例如,当你想要显示更大的启动器图标,或者你有动画来增加图像的大小时,就需要这样做。在这种情况下,为了确保最佳图像质量,您应该将图像放入 mipmap 文件夹中。 Android会做的是,它会尝试从更高密度的存储桶中获取图像,而不是将其扩展。这将增加图像的清晰度(质量)。

  3. 因此,决定将图像放在哪里的经验法则是:

    • 启动器图标始终进入 mipmap 文件夹。
    • 图片,通常按比例放大(或按比例缩小)并且其质量对应用程序至关重要,也可以进入 mipmap 文件夹。
    • 所有其他图片通常是 drawables

答案 3 :(得分:23)

4.3中的mipmaps的Android实现正是1983年维基百科文章中解释的技术:)

  

mipmap集的每个位图图像都是缩小版的副本   主要纹理,但在一定程度上降低了细节。虽然   当视图足以渲染时,仍将使用主纹理   它完全详细,渲染器将切换到合适的mipmap图像   (...)从远处或小尺寸观看纹理时。

虽然这被描述为3D图形技术(因为它提到“从远处观看”),但它也适用于2D(翻译为“绘制的是较小的空间”,即“缩小”)。 / p>

对于一个具体的Android示例,假设您有一个具有特定背景可绘制的视图(特别是BitmapDrawable)。您现在使用动画将其缩放到原始大小的0.15。通常,这需要缩减每帧的背景位图。然而,这种“极端”降尺度可能会产生视觉伪影。

但是,您可以提供一个mipmap,这意味着图像已经预先渲染了几个特定的​​比例(比方说1.0,0.5和0.25)。每当动画“越过”0.5阈值时,不是继续缩小原始的1.0大小的图像,而是切换到0.5图像并缩小它,这应该提供更好的结果。等动画继续进行。

这有点理论化,因为它实际上是由渲染器完成的。根据Bitmap类的来源,它只是一个提示,渲染器可能会也可能不会尊重它。

/**
 * Set a hint for the renderer responsible for drawing this bitmap
 * indicating that it should attempt to use mipmaps when this bitmap
 * is drawn scaled down.
 *
 * If you know that you are going to draw this bitmap at less than
 * 50% of its original size, you may be able to obtain a higher
 * quality by turning this property on.
 * 
 * Note that if the renderer respects this hint it might have to
 * allocate extra memory to hold the mipmap levels for this bitmap.
 *
 * This property is only a suggestion that can be ignored by the
 * renderer. It is not guaranteed to have any effect.
 *
 * @param hasMipMap indicates whether the renderer should attempt
 *                  to use mipmaps
 *
 * @see #hasMipMap()
 */
public final void setHasMipMap(boolean hasMipMap) {
    nativeSetHasMipMap(mNativeBitmap, hasMipMap);
}

我不太清楚为什么这会特别适合应用程序图标。虽然平板电脑上的Android以及一些发射器(例如GEL)请求“一个密度更高”的图标以显示更大,但这应该使用常规机制(即drawable-xxxhdpi,&amp; c)完成

答案 4 :(得分:11)

  

我在另一个值得指出的帖子中提到的一件事 - 如果你为不同的密度构建不同版本的应用程序,你应该知道&#34; mipmap&#34;资源目录。这就像&#34; drawable&#34;资源,除了在创建不同的apk目标时不参与密度剥离。

https://plus.google.com/105051985738280261832/posts/QTA9McYan1L

答案 5 :(得分:4)

由于我正在寻找澄清答案,以确定通知图标的正确类型,我想在主题中添加这个明确的声明。它来自http://developer.android.com/tools/help/image-asset-studio.html#saving

  

注意:启动器图标文件位于与其不同的位置   其他图标。它们位于mipmap /文件夹中。 所有其他图标   文件驻留在项目的drawable /文件夹中。

答案 6 :(得分:2)

  

在Android中处理图片时,您需要处理两种情况:

     
      
  1. 您希望为设备密度加载图像,并且您将“按原样”使用它,而不会更改其实际大小。在这种情况下你   应该使用drawables,Android会给你最合适的   图像。
  2.   
  3. 您希望为设备密度加载图像,但此图像将按比例放大或缩小。例如,当你这需要时   想要显示更大的启动器图标,或者你有一个动画,哪个   增加图像的大小。在这种情况下,为了确保最佳图像质量,   你应该把你的图像放到mipmap文件夹中。 Android会做什么,   它会尝试从更高密度的桶中取出图像   扩大规模。
  4.         

    <强> SO

         

    因此,根据经验确定将图像放入的位置   是:

         
        
    1. 启动器图标始终进入mipmap文件夹。

    2.   
    3. 通常按比例放大(或缩小尺寸)且质量对应用程序至关重要的图片会进入mipmap文件夹   好。

    4.   
    5. 所有其他图片都是常用的图片。

    6.   

来自this文章的引文。

答案 7 :(得分:1)

res/
mipmap-mdpi/ic_launcher.png (48x48 pixels)
mipmap-hdpi/ic_launcher.png (72x72)
mipmap-xhdpi/ic_launcher.png (96x96)
mipmap-xxhdpi/ic_launcher.png (144x144)
mipmap-xxxhdpi/ic_launcher.png (192x192)

启动器的应用程序图标的MipMap

http://android-developers.blogspot.co.uk/2014/10/getting-your-apps-ready-for-nexus-6-and.html

https://androidbycode.wordpress.com/2015/02/14/goodbye-launcher-drawables-hello-mipmaps/

答案 8 :(得分:1)

如果您为目标屏幕分辨率(如HDPI)构建APK,则Android资产打包工具AAPT可以删除您不需要的其他分辨率的drawable。但如果它位于mipmap文件夹中,那么这些资产将会无论目标分辨率如何,都要留在APK中。

答案 9 :(得分:1)

当为不同的密度构建单独的apks时,其他密度的可绘制文件夹被剥离。这将使图标在使用更高密度的启动器图标的设备中显得模糊。 由于mipmap文件夹不会被剥离,因此最好使用它们来包含启动器图标。

答案 10 :(得分:-1)

我对mipmap的理解或多或少是这样的:

当需要绘制图像时,假设我们有不同的屏幕尺寸是分辨率,则必须进行一些缩放。

如果您的图像适用于低端手机,当您将其缩放到10英寸平板电脑的尺寸时,您必须“发明”实际上不存在的像素。这是通过一些插值完成的算法。必须发明的像素数量越多,过程所需的时间越长,质量开始失败。使用更复杂的算法需要更长的时间来获得最佳质量(例如,周围像素的平均值与复制最近的像素相比)。 / p>

为了减少必须发明的像素数量,使用mipmap可以提供相同图像的不同尺寸/分辨率,系统将选择最接近必须渲染的分辨率的图像并从那里进行缩放。这应该减少发明像素的数量,节省用于计算这些像素的资源,以提供高质量的图像。

我在一篇文章中解释了这一点,该文章解释了缩放图像时libgdx中的性能问题:

http://www.badlogicgames.com/wordpress/?p=1403