mipmap可绘制的图标

由于Android 4.3,我们现在可以使用res/mipmap文件夹来存储“mipmap”图像。

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

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

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

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

参考文献:

Android 4.3 APIs文档有如下说法:

使用mipmap作为位图或绘图的源代码是一种提供高质量图像和各种图像比例的简单方法,如果您期望在animation期间缩放图像,那么这种方法特别有用。

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图标来显示较大的应用程序快捷方式)。

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

我仍然倾向于跟随兰迪·苏比安诺(Randy Sugianto)的跟进:

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


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


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


更新#1

这里有一个博客post,试图解释一下。

  • 在Android 4.3中绘制的Mipmapping

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

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

Chrome mipmap-hdpi icon.png

奇怪的是,这是72×72,而不是我所期望看到的48×48。

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


更新#2

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

  • 为Nexus 6和Nexus 9准备好应用程序

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

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


更新#3

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


mipmap有两个不同的用途。

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

2)来自4.3的实际的mipmap API。 我没有用过这个,也不熟悉它。 这不是由Android开源项目发射器使用,我不知道任何其他启动器使用。

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

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

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

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

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

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

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

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

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

这是有点理论的,因为它实际上是由渲染器完成的。 根据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)完成。

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

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

  1. 您想要为您的设备密度加载图像,并且将“按原样”使用, 而不更改其实际大小 。 在这种情况下,你应该使用绘图工具 ,Android会给你最合适的图像。

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

因此,根据经验法则决定将图片放在哪里将是:

  • 启动器图标总是进入mipmap文件夹。
  • 图像经常被放大 (或缩小),并且其质量对应用程序至关重要,因此也会进入mipmap文件夹。
  • 所有其他图像是通常的drawables

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

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

因为我正在寻找一个澄清的答案来确定通知图标的正确types,所以我想添加这个明确的声明的话题。 它来自http://developer.android.com/tools/help/image-asset-studio.html#saving

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

在Android中处理图像时有两种情况:

  1. 您想要为您的设备密度加载图像,并且将“按原样”使用,而不更改其实际大小。 在这种情况下,你应该使用绘图工具,Android会给你最合适的图像。
  2. 您想要为您的设备密度加载图像,但是此图像将会放大或缩小。 例如,当你想显示一个更大的启动器图标,或者你有一个animation,这会增加图像的大小,这是需要的。 在这种情况下,为了确保最佳图像质量,您应该将图像放入mipmap文件夹中。 Android将会做什么,它会尝试从更高密度的存储区中提取图像,而不是将其扩展。

所以

因此,根据经验法则决定将图片放在哪里将是:

  1. 启动器图标总是进入mipmap文件夹。

  2. 图像经常被放大(或缩小),并且其质量对应用程序至关重要,因此也会进入mipmap文件夹。

  3. 所有其他图像是通常的drawables。

引用这篇文章。

如果您为HDPI等目标屏幕分辨率构buildAPK,则Android资产打包工具AAPT可以去除您不需要的其他分辨率的绘图。但是,如果它位于mipmap文件夹中,则这些资源将保留在APK,而不pipe目标分辨率。

当为不同的密度构build不同的文件夹时,其他密度的可拖动文件夹会被删除。 这会使图标在使用较高密度的启动器图标的设备中显得模糊。 由于mipmap文件夹不会被剥离,因此最好使用它们来包含启动器图标。

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

当需要绘制图像时,由于我们有不同的屏幕尺寸是分辨率,一些缩放将不得不参与。

如果您的图片适合低端手机,则将其缩放到10英寸的平板电脑时,您必须“发明”实际上不存在的像素,这是通过一些插值algorithm完成的。更多的像素必须被发明,这个过程花费的时间越长,质量开始失败。最好的质量是用更复杂的algorithm,需要更长的时间(周围像素的平均值,例如复制最近的像素)来获得。

为了减less必须发明的像素的数量,使用mipmap,您可以提供同一图像的不同尺寸/scheme,系统将select最近的图像作为必须渲染的分辨率,然后从中进行缩放。 这应该减less发明像素的数量,节省资源以用于计算这些像素以提供良好质量的图像。

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

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

 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/