首页 文章

Mipmap drawables图标

提问于
浏览
414

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

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

How are these mipmap images different from the other familiar drawable images?

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

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

参考文献:

Android 4.3 APIs文件有如下说法:

使用mipmap作为位图或drawable的源是提供高质量图像和各种图像比例的简单方法,如果您希望在动画期间缩放图像,这将特别有用 . Android 4.2(API级别17)在Bitmap类中添加了对mipmap的支持 - 当您提供了mipmap源并启用了setHasMipMap()时,Android会在您的Bitmap中交换mip图像 . 现在在Android 4.3中,您还可以通过提供mipmap资源并在位图资源文件中设置android:mipMap属性或通过调用hasMipMap()来为BitmapDrawable对象启用mipmaps .

我没有看到任何有助于我理解的东西 .


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实现相关联 .


我们现在应该存储所有 app icons in res/mipmap folders ,以及这些mipmap图像的 guidelines 是什么?


Update #1

这是一篇博文,试图解释一下 .

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

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

Chrome mipmap-hdpi icon.png

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

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


Update #2

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

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

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


Update #3

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


11 回答

  • 26

    在Android中使用图像时,有两种情况需要处理:您希望为设备密度加载图像,并且您将“按原样”使用它,而不会更改其实际大小 . 在这种情况下,您应该使用drawables,Android将为您提供最佳的图像 . 您希望为设备密度加载图像,但此图像将按比例放大或缩小 . 例如,当您想要显示更大的启动器图标,或者您有动画时,需要这样做,这会增加图像的大小 . 在这种情况下,为了确保最佳图像质量,您应该将图像放入mipmap文件夹中 . Android会做的是,它会尝试从更高密度的存储桶中获取图像,而不是将其放大 . 因此,决定将图像放入何处的经验法则是:启动器图标始终进入mipmap文件夹 . 通常按比例放大(或缩小尺寸)并且其质量对应用程序至关重要的图像也会进入mipmap文件夹 . 所有其他图像都是通常的drawables .

    来自this文章的引文 .

  • 74

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

  • -1

    由于我正在寻找一个明确的答案,以确定通知图标的正确类型,我'd like to add this clear statement to the topic. It' s从http://developer.android.com/tools/help/image-asset-studio.html#saving

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

  • 1

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

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

    • 您想要为您的设备密度加载图像,并且您将使用它"as is",而不更改其实际大小 . 在这种情况下,您应该使用 drawables ,Android将为您提供最合适的图像 .

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

    因此,决定将图像放入何处的经验法则是:

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

    • 图像通常按比例放大(或按比例缩小),其质量对应用程序至关重要,也可以进入 mipmap 文件夹 .

    • 所有其他图像通常 drawables .

  • 2

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

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

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

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

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

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

  • 244

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

    mipmap集的每个位图图像都是主纹理的缩小副本,但是在某个降低的细节级别 . 虽然当视图足以完全呈现细节时仍会使用主纹理,但是当从远处或小尺寸查看纹理时,渲染器将切换到合适的mipmap图像(...) .

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

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

    但是,您可以提供一个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以及一些 Launcher (例如GEL)请求图标"one density higher"显示更大,但这应该使用常规机制(即 drawable-xxxhdpi ,&c)来完成 .

  • 11

    由于所有这些答案,谷歌似乎已经 updated their docs ,所以希望这将有助于未来的其他人:)我自己也遇到了这个问题,同时创建了一个新的(新的)项目 .

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

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

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

  • 4

    我在另一个值得指出的线程中提到的一件事 - 如果你为不同的密度构建不同版本的应用程序,你应该知道“mipmap”资源目录 . 这与“可绘制”资源完全相同,只是在创建不同的apk目标时不参与密度剥离 .

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

  • 1

    mipmap有两种不同的用途:

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

    • 4.3中的实际mipmap API . 我没有用过这个并且不熟悉它 . 它没有被Android开源项目 Launcher 使用,我也不知道有任何其他 Launcher 使用 .

  • 0

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

  • 23
    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/

相关问题