Mipmap可绘制的图标

从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 API文档具有以下内容:

将mipmap用作位图或绘图的源代码是提供高质量图像和各种图像比例尺的简单方法,如果您希望在动画过程中缩放图像,这可能特别有用。

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

我没有看到任何有助于我理解的内容。


XML位图资源具有android:mipMap属性:

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

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


Google Groups(资源名称“mipmap”?!!的目的)提出了这个问题,Romain Guy回答说:

以更高分辨率提供通常会计算出来的图像很有用(例如,在mdpi设备上,启动程序可能希望较大的hdpi图标显示较大的应用程序快捷方式。)

我觉得这几乎是有意义的,但不完全。

我仍然倾向于与兰迪Sugianto的后续行动:

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


当然,维基百科有一个“Mipmap”的页面,它指的是1983年发明的一种较老的技术,我不能完全涉及到当前的Android实现。


我们现在是否应该将所有应用程序图标存储res/mipmap文件夹中 ,以及这些mipmap图像的指导原则是什么?


更新#1

这里有一篇博客文章试图解释一下。

  • Mipmapping绘制在Android 4.3中
  • 但是该博客文章中使用的图像显示了一个文件,其中包含多个徽标。 这不是我在Chrome的mipmap文件夹中看到的。

    Chrome的mipmap-hdpi文件夹包含三个图像。 一个是Chrome徽标,就其本身而言。

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

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


    更新#2

    2014年10月23日的Android Developers博客文章再次证实了将mipmap文件夹用于应用程序图标的想法:

  • 为Nexus 6和Nexus 9准备应用程序
  • 在谈到Nexus 6屏幕密度时,作者写道:

    将您的应用程序图标放置在mipmap文件夹(而不是可绘制文件夹)中是最好的做法,因为它们的使用方式不同于设备的当前密度。 例如,可以在启动器上为xxhdpi设备使用xxxhdpi应用程序图标。


    更新#3

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



    mipmap有两种不同的用途:

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

  • 4.3中的实际mipmap API。 我没有用过这个,也不熟悉它。 它没有被Android开源项目启动器使用,我不知道任何其他启动器正在使用。


  • 看起来谷歌已经更新了他们的文档,因为所有这些答案,所以希望这将有助于其他人在未来:)刚刚自己遇到这个问题,同时创建一个新的(新的)项目。

    TL; DR:drawable可能会作为dp特定资源优化的一部分而被剥离出来。 Mipmaps不会被剥离。

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

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


    4.3中的mipmap的Android实现正是1983年在Wikipedia文章中解释的技术:)

    mipmap集的每个位图图像都是主纹理的缩小副本,但是在某种程度上降低了细节。 尽管当视图足够详细地渲染时仍然会使用主纹理,但是当从远处或小尺寸查看纹理时,渲染器将切换到合适的mipmap图像(...)。

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

    对于一个具体的Android例子,假设你有一个带有特定背景的View(特别是一个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 ,&c)来完成。

    链接地址: http://www.djcxy.com/p/93055.html

    上一篇: Mipmap drawables for icons

    下一篇: Android: Declaring static bitmaps? Yay or nay?