-anydpi 和 -nodpi 有什么区别?

What Is The Difference Between -anydpi And -nodpi?

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

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

有没有人看过-anydpi的官方说法,和-nodpi有什么关系?我在寻找实际效果,而不仅仅是一些代码注释所暗示的。

source code 包含以下注释(第 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;

希望这能消除困惑。

点头

These are density-independent resources. The system does not scale resources tagged with this qualifier, regardless of the current screen's density.

例如:

  • drawable-nodpi/dot.png

这个点在 xxhdpi 上会显得很小,在 ldpi 上会很大。

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

例如

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

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

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

任何dpi

These resources take precedence in any dpi.

例如

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

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

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

参考

注意:anydpi 已添加到 change Ic3288d0236fe0bff20bb1599aba2582c25b0db32

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

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

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