允许在Android Drawables中自动缩放以获得各种密度?

时间:2013-03-11 20:43:25

标签: android performance android-resources android-memory

许多针对Android开发的博客和最佳做法都说

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

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

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

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

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

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

* 如果我将图像从大型MDPI移动到大型HDPI,它可以在没有任何崩溃的设备上正常工作。 *

所以我有两个问题。

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

2 个答案:

答案 0 :(得分:3)

  1. 只要缩放时drawables看起来很好,那将是一种方法。缩小尺寸通常比缩放更好。也就是说,有这条线:

      

    即便如此,当位图缩放到密度时,也没有设计   因为,你可能会得到诸如软化边缘之类的文物。

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

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

    当您将它们放入HDPI文件夹时,您告诉它缩小到TVDPI,因此生成的图像占用的内存更少。

    在实际缩放中也会产生开销。

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

答案 1 :(得分:0)

  1. 不,您可以将图片资源放入任何可绘制的文件夹中。如果您只将资源放在一个密度文件夹中,系统将向上和向下扩展到目标设备密度。
  2. 您希望在同时使用这些大图像时使用大量内存。即使您使用压缩图像格式,当系统在屏幕上绘制它时,它也会在内存中作为位图。因此,如果同时在内存中保留4-5个1200x800像素图像,它将占用位图中的内存量。这会使你的应用程序崩溃,因为它耗尽了已授权的内存(默认情况下它非常低,只能确保16 MB,这通常会被制造商扩大)。
  3. 当您将图像放入hdpi时,系统按比例缩小图像,这就是为什么可能(不保证)足够的内存用于较小的图像。

    解决方案:不要将那些大图像用作背景。尝试可扩展的图像,并查看9补丁格式:link