【问题标题】:Allow auto scaling in Android Drawables for various densities?允许在 Android Drawables 中针对各种密度自动缩放?
【发布时间】:2013-03-12 05:07:15
【问题描述】:

很多关于 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. 内部发生了什么,为什么它第一次崩溃?

【问题讨论】:

    标签: android performance android-resources android-memory


    【解决方案1】:
    1. 只要可绘制对象在缩放时看起来不错,那将是一种方法。缩小尺寸通常比放大尺寸要好。也就是说,有这样一行:

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

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

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

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

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

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

    【讨论】:

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

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

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

      【讨论】:

      • 我知道 9 补丁是一个不错的概念。但有时我们无能为力,因为您知道客户的要求不会改变。而且我不建议使用 Deev 也提到的任何文件夹...因为结果很清楚...
      猜你喜欢
      • 2019-10-02
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      相关资源
      最近更新 更多