【问题标题】:What Is The Difference Between -anydpi And -nodpi?-anydpi 和 -nodpi 有什么区别?
【发布时间】:2016-03-13 10:28:09
【问题描述】:

如果您在 Android Studio 1.5.0 中使用矢量资源向导,您使用该向导导入的任何矢量可绘制 XML 都会进入 res/drawable/

但是,build/ 目录和生成的 APK 显示这些 XML 文件被移动到了 res/drawable-anydpi-v21/ 资源目录中。 -v21 部分很有意义,因为 VectorDrawable 仅在 API 级别 21+ 上受支持。但是,-anydpi 似乎没有记录。我本来希望 -nodpi 用于原始导入目标和构建系统选择移动它的位置。

有没有人看过官方声明-anydpi 的含义,以及它与-nodpi 的关系?我正在寻找实际效果,而不仅仅是一些代码 cmet 暗示的内容。

【问题讨论】:

标签: android android-resources


【解决方案1】:

我对所有内容都使用 drawable-nodpi,包括用于我的游戏的大量大型图形。使用 -anydpi 扩展图形的一个未记录的结果是它以指数方式增加内存使用。因此,如果您有一个 1MB 的可绘制图形,它将根据用户设备的分辨率缩放到 4MB、16MB、64MB 或更大。设备分辨率不断提高。当然,按比例放大实际上并不会增加图形的清晰度。绘图操作可以指示每个图形相对于屏幕尺寸的大小,无需让应用程序膨胀。也没有多个分辨率特定的绘图文件夹。

【讨论】:

  • 被低估的答案。我遇到了同样的问题:有一个 100KB 大的图像,但加载时经常出现 OOM 错误。该应用程序崩溃了,说它无法分配 18MB !!!无法理解这 100KB 是如何变成 18MB 的,但这实际上是缩放的结果。将图像切换为 no-dpi 解决了这个问题。
  • 在使用drawable-nodpi(或mipmap-nodpi)时,内存方面实际上是最重要的。
【解决方案2】:

nodpi

这些是与密度无关的资源。无论当前屏幕的密度如何,系统都不会缩放带有此限定符标记的资源。

例如:

  • drawable-nodpi/dot.png

点会在 xxhdpi 上显示为小,在 ldpi 上显示为大。

但是,如果存在,资源解析器将匹配特定的限定符。

例如

  • drawable-hdpi/eg.png
  • drawable-nodpi-v21/eg.xml

在 Lollipop (API 21) hdpi 设备上,使用位图

在 Lollipop (API 21) xhdpi 设备上,使用向量。

anydpi

这些资源在任何 dpi 中都具有优先权。

例如

  • drawable-hdpi/eg.png
  • drawable-anydpi-v21/eg.xml

在 Lollipop (API 21) hdpi 设备上,使用 vector

在 Lollipop (API 21) xhdpi 设备上,使用向量。

参考

注意change Ic3288d0236fe0bff20bb1599aba2582c25b0db32 中添加了 anydpi。

【讨论】:

  • 这不是我所看到的。引用我的赏金:“鉴于 res/drawable-nodpi/ 和 res-drawable-mdpi/ 中相同资源的两个版本,我在运行 Android 6.0 的 Nexus 5 上获得了 res/drawable-nodpi/ 版本,即 -xxhdpi设备”。您是否有演示您引用的行为的示例项目?
  • 那是因为你使用了drawable。 SDK 的行为可能已经改变。见VectorDrawable: Android loads xhdpi PNG's instead of the vector resource
  • "在 xxxdpi 上,框架将采用 hdpi 位图。" -- 这就是没有发生的事情,尽管我的测试是在-xxhdpi 设备上进行的。我有res/drawable-mdpi/nodpi_and_m.pngres/drawable-nodpi/nodpi_and_m.xml。在 Nexus 5 -xxhdpi 设备上,使用的资源是 res/drawable-nodpi/nodpi_and_m.xml。根据您的算法和我的期望,应该使用res/drawable-mdpi/nodpi_and_m.png。这不是正在发生的事情。
  • 底线:你应该把向量放在drawable-anydpi-v21。如果你有支持向量可绘制库,你可以将它们放在drawable-anydpi 或简单地drawable
  • drawable-nodpi 文件夹的一大优势是缩放会在用户端使用默认可绘制文件夹以指数方式增加高分辨率屏幕(4x、16x 等)的应用程序内存使用。我通过检查我的游戏应用程序在使用 drawable 与 drawable-nodpi 图形资产运行时的内存使用情况发现了这一点。我很惊讶这在任何地方都没有记录。
【解决方案3】:

source code 包含以下 cmets(第 639 行):

/**
 * Value for {@link #densityDpi} for resources that scale to any density (vector drawables).
 * {@hide}
 */
public static final int DENSITY_DPI_ANY = 0xfffe;

/**
 * Value for {@link #densityDpi} for resources that are not meant to be scaled.
 * {@hide}
 */
public static final int DENSITY_DPI_NONE = 0xffff;

希望这能消除混乱。

【讨论】:

  • “希望这能消除混乱”——不是真的。目前尚不清楚“缩放到任何密度”和“不打算缩放”在实践中的区别是什么。 -nodpi 目录中的 Drawable 肯定会根据大小进行缩放,具体取决于有关如何使用 drawable 的任何规则。
  • “不打算缩放”意味着无论程序员做什么或密度如何,它们都不会被缩放。
  • 我认为他们所说的“缩放到任何密度”是指矢量可绘制对象,无论密度有多大,它们都会缩放以适应任何密度。
  • 它被添加到android.googlesource.com/platform/frameworks/base/+/31245b4%5E!,你可以从中了解到它可能修复了一些bug 17007265
  • @MarcinJędrzejewski:实际上,“被选为最佳匹配,除非存在与请求的密度完全匹配的配置”对该提交的评论给了我一个线索。谢谢!
【解决方案4】:

nodpi:所有密度的资源。这些是与密度无关的资源。无论当前屏幕的密度如何,系统都不会缩放带有此限定符标记的资源。

anydpi:此限定符匹配所有屏幕密度并优先于其他限定符。这对于矢量绘图很有用。在 API 级别 21 中添加。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    相关资源
    最近更新 更多