什么是-anydpi和-nodpi之间的区别?

Com*_*are 103 android android-resources

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

但是,build/目录和生成的APK显示这些XML文件被移动到res/drawable-anydpi-v21/资源目录中.该-v21部分是有意义的,因为VectorDrawable仅在API Level 21+上支持.但是,-anydpi似乎没有证件.我-nodpi原本期望,无论是原始导入目的地还是构建系统选择移动它的地方.

有没有人看到关于什么-anydpi方式的正式声明,以及它与它的关系是-nodpi什么?我正在寻找实际效果,而不仅仅是一些代码评论暗示的内容.

rds*_*rds 96

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设备上,使用矢量.

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

参考

注意:在更改Ic3288d0236fe0bff20bb1599aba2582c25b0db32中添加了anydpi.

  • 底线:您应该将向量放在 `drawable-anydpi-v21` 中。如果你有 support-vector-drawable 库,你可以把它们放在 `drawable-anydpi` 或简单的 `drawable` 中。 (3认同)
  • Drawable-nodpi 文件夹的一大优点是,对于默认的可绘制文件夹,缩放会在高分辨率屏幕(4x、16x 等)的用户端以指数形式增加应用程序内存使用量。我通过检查我的游戏应用程序在使用可绘制与可绘制-nodpi 图形资源运行时的内存使用情况发现了这一点。我很惊讶这没有任何地方记录。 (2认同)

Vis*_*ngh 15

源代码包含以下注释(线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;
Run Code Online (Sandbox Code Playgroud)

希望这可以消除混乱.

  • "希望这能清除混乱" - 不是真的.目前尚不清楚"规模与任何密度"和"不应缩放"之间的差异在实践中意味着什么.`-nodpi`目录中的drawables肯定会根据大小进行缩放,根据有关如何使用drawable的规则. (7认同)
  • 它被添加到https://android.googlesource.com/platform/frameworks/base/+/31245b4%5E!/,从中你可以了解它可能修复了一些错误17007265 (3认同)
  • @MarcinJędrzejewski:实际上,“被选为最佳匹配,除非有一个配置与请求的密度完全匹配”对该提交的评论给了我一个线索。谢谢! (2认同)

dzi*_*kyy 8

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

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


And*_*der 7

我使用drawable-nodpi作为一切,我有很多大图形."扩展"图形的一个未记录的后果是它会以指数方式增加内存使用量.因此,如果你有'drawable'的100M图形,它将缩放到400M或1.6G,具体取决于用户设备的分辨率.设备分辨率不断提升.当然,扩大规模实际上不会增加​​图形的"清晰度".无论如何,绘图操作可以指示图形相对于屏幕大小的大小,不需要使用多个绘图文件夹来膨胀应用程序.

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