2

很多关于 Android 开发的博客和最佳实践说

您不需要为每种可能的密度提供位图,Android 会缩放您的位图(通常在加载时)以匹配当前密度。”

参考链接: https: //plus.google.com/105051985738280261832/posts/6eWwQvFGLV8

我试过了,效果很好。但我无法理解一件事。

例如,我在视图寻呼机中创建了一个示例应用程序,其中包含 5 个大约 1.5 MB 的全屏图像。

我为 Galaxy Tab 2 等 7 英寸 MDPI 设备创建了重图像,并将它们放在“drawable-large-mdpi”文件夹中。它有点生涩,但没有崩溃,让我滚动浏览所有图像。

现在我尝试在几乎是大型 HDPI 设备的 Nexus 7 上使用该应用程序。该应用程序在解码位图时因“OOM 错误”而崩溃。

*如果我将图像从大 MDPI 移动到大 HDPI,它在两个设备上都可以正常工作而不会出现任何崩溃。*

所以我有两个问题。

  1. 这个结果是否倾向于,我们只能将图形资源放在最高密度的可绘制文件夹中,并让它在其范围内自动缩小?
  2. 内部发生了什么,为什么它第一次崩溃?
4

2 回答 2

3
  1. 只要可绘制对象在缩放时看起来不错,那将是一种方法。缩小规模通常比扩大规模更好。也就是说,有这样一行:

    即便如此,当位图缩放到没有设计的密度时,您可能会得到诸如边缘软化之类的伪影。

    HDPI从到缩放TVDPI工作正常的原因是因为两个密度非常接近。一些图像的问题将开始出现在主要密度之间。例如,从 跳到HDPI肯定LDPI会导致许多伪影,因为图像根本不是为低分辨率设计的。

  2. Nexus 7 中的 OOM 很可能会崩溃,因为它会拍摄设备认为是MDPI图像的大图像并将它们放大到TVDPI设置。这将导致更大的图像。

    当您将它们放在 HDPI 文件夹中时,您是在告诉它按比例缩小以TVDPI使生成的图像占用更少的内存。

    在实际缩放中还有开销。

    当您扩展到 XHDPI 设备时,可能会发生同样的事情。

于 2013-03-11T21:07:15.513 回答
0
  1. 不,您可以将图形资源放入任何可绘制文件夹。如果您只将资源放在一个密度文件夹中,系统将按比例放大和缩小到目标设备密度。
  2. 您想在同时使用这些大图像时使用大量内存。即使你使用压缩的图像格式,当系统在屏幕上绘制它时,它也会以位图的形式存在于内存中。因此,如果您同时在内存中保留 4-5 个 1200x800 像素的图像,它将耗尽位图中的内存量。这使您的应用程序崩溃,因为它用完了授予的内存(默认情况下非常低,android 仅确保 16 mb,通常由制造商扩大)。

当您将图像放入 hdpi 时,系统会按比例缩小图像,这就是为什么可能(不保证)有足够的内存用于较小的图像。

解决方案:不要使用那么大的图像作为背景。尝试可扩展的图像,并查看 9-patch 格式:链接

于 2013-03-11T21:04:44.047 回答