-anydpi和-nodpi有什么区别?


108

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

但是,该build/目录以及生成的APK显示这些XML文件已移动到res/drawable-anydpi-v21/资源目录中。该-v21部分很有意义,VectorDrawable仅在API Level 21+上受支持。但是,-anydpi似乎没有证件。-nodpi对于原始的导入目标以及构建系统选择将其移动到的位置,我都料想不到。

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


Answers:


106

无dpi

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

例如:

  • drawable- nodpi /dot.png

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

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

例如

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

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

在棒棒糖(API 21)xhdpi设备上,使用了矢量。

任何dpi

这些资源在任何dpi中优先。

例如

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

在棒棒糖(API 21)hdpi设备上,使用了矢量

在棒棒糖(API 21)xhdpi设备上,使用了矢量。

参考

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


那不是我所看到的。悬赏金额:“在res / drawable-nodpi /和res-drawable-mdpi /中提供了相同资源的两个版本,我在运行Android 6.0的Nexus 5上获得了res / drawable-nodpi /版本,即-xxhdpi设备”。您是否有一个示例项目来演示您所引用的行为?
CommonsWare,2015年

那是因为您使用过drawable。SDK的行为可能已更改。请参见VectorDrawable:Android会加载xhdpi PNG而不是矢量资源
rds,

“那是因为您使用了drawable”-您的回答也是如此。您在答案中引用的每个资源目录都是一个drawable资源目录,就像我在赏金中引用的两个目录都是drawable资源目录一样。
CommonsWare,2015年

“在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应该使用。那不是正在发生的事情。
CommonsWare,2015年

2
底线:您应该将向量放在中drawable-anydpi-v21。如果您有support-vector-drawable库,则可以将它们放在中drawable-anydpi或简单地将其放置drawable
rds

17

源代码包含以下注释(线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;

希望这能消除混乱。


8
“希望这可以消除混乱”-并非如此。目前尚不清楚“按比例缩放到任何密度”和“不按比例缩放”之间的区别是什么。-nodpi目录中的可绘制对象肯定会根据尺寸的大小进行缩放,这取决于可绘制对象如何使用的任何规则。
CommonsWare 2015年

“不打算按比例缩放”表示无论程序员做什么或按什么密度进行缩放都不会缩放。
Vishavjeet Singh

我认为它们的意思是“按比例缩放至任何密度”,它们指的是矢量可绘制对象,无论密度有多大,它都可以缩放以适合任何密度。
Vishavjeet Singh

3
它是在android.googlesource.com/platform/frameworks/base/+/31245b4%5E中添加的,从中您可以了解到它可能已修复了一些错误17007265
marcinj 2015年

1
@MarcinJędrzejewski:实际上,“除非具有与所需密度完全匹配的配置,否则它被选为最佳匹配”的注释为我提供了一个线索。谢谢!
CommonsWare 2015年

10

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

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


9

我对所有内容都使用drawable-nodpi,包括用于游戏的大量大型图形。放大图形的一个未记录的结果是,它成倍增加了内存使用量。因此,如果您有1MB可绘制的图形,则它将根据用户设备的分辨率缩放到4MB,16MB或64MB。设备分辨率不断提高。当然,扩大比例实际上并不会增加图形的清晰度。无论如何,绘图动作都可以指示每个图形相对于屏幕大小应该有多大,而无需使应用程序具有多个绘图文件夹。


3
被低估的答案。我遇到了同样的问题:图像大100KB,但是在加载时经常出现OOM错误。该应用程序崩溃,表明它无法分配18MB !!!无法理解如何将这100KB转换为18MB,但这实际上是这种扩展的结果。将图像切换为无dpi可解决此问题。
西蒙·尼农
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.