Mipmap可缩放图标的绘制

474
自Android 4.3(Jelly Bean)起,我们现在可以使用res/mipmap文件夹来存储“mipmap”图像。例如,Chrome for Android将其图标存储在这些文件夹中,而不是更常规的res/drawable文件夹。那么这些mipmap图像与其他熟悉的drawable图像有什么不同呢?我发现在我的清单中,我们使用@mipmap/限定符,而不是@drawable/,这在资源文件夹名称上是有意义的。
<activity
    android:name=".MipmapDemp"
    android:icon="@mipmap/ic_launcher" />

参考资料:

Android 4.3 APIs文档如下所述:

使用mipmap作为位图或可绘制对象的源是提供高质量图像和各种图像比例的简单方法,如果您希望在动画期间缩放图像,则这尤其有用。

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

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


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

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

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


这个问题在Google Groups上被提出(资源名称“mipmap”的目的是什么?!),Romain Guy回答道:

提供一个比通常计算得到的更大分辨率的图像是有用的(例如,在mdpi设备上,启动器可能希望显示大的应用程序快捷方式的更大的hdpi图标)。

我觉得这几乎解释清楚了,但还是有点模糊。

我还倾向于采用Randy Sugianto的跟进建议:

这有什么优势吗?是否有指南可以使用mipmaps,也许是为了更好的启动器图标?


当然,维基百科有一个"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 Developers博客文章再次确认使用mipmap文件夹作为应用程序图标的想法:

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

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


更新 #3

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


12个回答

1

感谢您的第二篇博客文章!它非常清晰地阐述了drawable-XXXmipmap-XXX文件夹的使用差异:启动器图标与其他资源不同,因为在用户的启动器中可能显示更高分辨率的图标。如果该高分辨率图像已从您的可绘制文件夹中删除,则程序将自动缩放较低密度的图标。这可能会导致模糊的不美观的图标。 - winklerrr
在Nexus P6上的Android 8.1中,绘制文件夹中的启动图标并没有被放大。实际上它们根本就不存在,这会导致应用程序在打开时崩溃。 - matthew

-1
我对mipmap的理解大致如下:
当需要绘制图像时,由于不同的屏幕尺寸和分辨率,必须进行一些缩放。
如果您有一张适合低端手机的图像,当您将其缩放到10英寸平板电脑的大小时,您必须“发明”实际上不存在的像素。这是通过某种插值算法完成的。需要发明的像素越多,处理时间就越长,质量也开始下降。使用更复杂的算法可以获得最佳质量(例如,周围像素的平均值与最近像素的复制)。
为了减少需要发明的像素数量,使用mipmap提供相同图像的不同大小/分辨率,系统将选择最接近要呈现的分辨率的图像,并从那里进行缩放。这应该减少发明像素的数量,节省资源用于计算这些像素以提供高质量的图像。
我在一篇文章中读到了这个问题,该文章解释了libgdx在缩放图像时的性能问题。

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


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