用于图标的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作为位图或可绘制对象的源是一个简单的方法 提供高质量图像和各种图像尺度的方法,都可以 特别有用,如果你希望你的图像缩放期间 动画。< / p > Android 4.2 (API级别17)在位图中增加了对mipmaps的支持 class-Android交换mip图像在你的位图,当你提供 一个mipmap源,并启用setHasMipMap()。在安卓4.3中, 你也可以为BitmapDrawable对象启用mipmaps 提供一个mipmap资产,并设置android: mipmap属性

. bitmap资源文件或调用hasMipMap()

我没有看到任何能帮助我理解的东西。


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

< p >布尔。启用或禁用mipmap提示。参见setHasMipMap() 更多的信息。

.默认值为false

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


这个问题是在谷歌Groups (< a href = " https://groups.google.com/forum/ !topic/android-developers/ZUyF0JEwibs" rel="noreferrer">资源名"mipmap"的用途?!< / >)上提出的,Romain Guy回答说:

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

我觉得这几乎说得通,但不完全是。

我仍然倾向于Randy Sugianto的后续观点:

这有什么好处?有使用指南吗 Mipmaps,可能是为了更好的启动器图标?< / p >


当然,维基百科有一个“Mipmap”的页面指的是1983年发明的一种更老的技术,我不能很好地与当前的Android实现联系起来。


这些天我们是否应该存储所有的res/mipmap文件夹中的应用程序图标,这些mipmap图像的的指导方针是什么?


Update # 1

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

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

Chrome的mipmap-hdpi文件夹包含三张图片。一个是Chrome的logo。

Chrome mimmap -hdpi icon.png

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

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


更新# 2

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

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

最好的做法是把你的应用程序图标放在mipmap-文件夹中(不是mipmap-文件夹) 可绘制-文件夹),因为它们用于不同的分辨率 器件的电流密度。例如,xxxhdpi应用程序图标可以是

在启动器上用于xxhdpi设备

更新# 3

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


195459 次浏览

mipmap有两种不同的用法:

  1. 当构建密度特定的apk时,用于启动器图标。有些开发者为每种密度构建单独的APK,以减小APK的大小。然而,有些启动器(游戏邦注:包括某些设备,或在Play Store上)使用了比标准48dp更大的图标尺寸。启动器使用getDrawableForDensity和缩放如果需要,而不是向上,所以图标是高质量的。例如,在hdpi平板电脑上,启动器可能会加载xhdpi图标。通过将启动器图标放在mimmap -xhdpi目录中,当为hdpi设备构建APK时,它不会像drawab -xhdpi目录那样被剥离。如果你正在为所有设备构建一个APK,那么这并不重要,因为启动器可以访问所需密度的可绘制资源。

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

我对mipmap的理解大致是这样的:

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

如果你有一个适合低端手机的图像,当你把它放大到10英寸平板电脑的大小时,你必须“发明”一些实际上不存在的像素。这是通过一些插值算法来实现的。需要创造的像素越多,制作过程所需的时间就越长,质量就会开始下降。最好的质量是通过更复杂的算法获得的,这需要更长的时间(例如,平均周围的像素vs复制最近的像素)。

为了减少必须创建的像素数量,可以使用mipmap为同一图像提供不同大小/分辨率的解决方案,系统将选择与必须渲染的分辨率最近的图像,并从那里进行缩放。这将减少发明像素的数量,节省用于计算这些像素以提供高质量图像的资源。

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

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

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

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

虽然这被描述为3D图形的技术(因为它提到了“从远处观看”),但它同样适用于2D图形(翻译为“绘制的是一个更小的空间”,即。“缩减规模”)。

对于一个具体的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, &c)来完成。

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

https://plus.google.com/105051985738280261832/posts/QTA9McYan1L < a href = " https://plus.google.com/105051985738280261832/posts/QTA9McYan1L " > < / >

似乎谷歌有更新文档,因为所有这些答案,所以希望这将帮助别人在未来:)刚刚遇到这个问题我自己,同时创建一个新的(新的)项目。

DR:可提款可能被剥离作为dp特定资源优化的一部分。mipmap不会被剥离。

不同设备上不同的主屏幕启动程序以不同的分辨率显示应用程序启动程序图标。当应用程序资源优化技术移除未使用屏幕密度的资源时,启动器图标可能会看起来模糊,因为启动器应用程序必须升级低分辨率的图标来显示。为了避免这些显示问题,应用程序应该使用mipmap/资源文件夹作为启动器图标。Android系统在不考虑密度剥离的情况下保留了这些资源,并确保启动程序可以选择分辨率最佳的图标进行显示。

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

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/

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

以下是我的观点,试图解释其中的区别。在Android中处理图像时有两种情况:

  1. 你想为你的设备密度加载一个图像,你将“原样”使用它,而不改变它的实际大小。在这种情况下,你应该使用drawables和Android将给你最好的拟合图像。

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

因此,决定把你的图像放在哪里的经验法则是:

  • 发射器的图标总是进入产生文件夹。
  • 图像通常是扩大(或极度缩小),其质量对应用程序至关重要,也会进入产生文件夹。
  • 所有其他图像通常是画板

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

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

如果你为HDPI这样的目标屏幕分辨率构建APK, Android资产打包工具AAPT就可以为你不需要的其他分辨率剔除绘图。但是如果它在mipmap文件夹中,那么不管目标分辨率如何,这些资产都将留在APK中。

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

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

    你想为你的设备密度加载一个图像,你将“原样”使用它,而不改变它的实际大小。在这种情况下 应该与绘图和Android会给你最好的合适的工作 李形象。< / >
  1. 你想为你的设备密度加载一个图像,但是这个图像将被放大或缩小。例如,当你 想要显示一个更大的启动器图标,或者你有一个动画 增加图像大小。在这种情况下,为了确保最佳图像质量, 您应该将图像放入mipmap文件夹中。Android会做的是, 它将尝试从密度更高的桶中获取图像

所以

因此,根据经验来决定把你的图像放在哪里 是:< / p >
  1. 启动器图标总是进入mipmap文件夹

  2. 图片通常是按比例放大(或极度缩小),其质量对应用程序至关重要,进入mipmap文件夹为 好。< /强> < / p > < /李>
  3. 所有其他图像都是通常的可绘制图像

引用自文章。

当我们为不同的密度建立单独的APK时,对于特定密度的APK,其他密度的可绘制文件夹被剥离。这将使图标在使用高密度启动器图标的设备上显得模糊。因为mipmap文件夹不会被剥离,所以最好使用它们来包含启动器图标。