密度合格的可绘制文件夹或drawable-nodpi会优先吗?

如果我为一个density qualified folder (例如drawable-hdpi)定义drawables,并且还绘制了drawable-nodpi中的drawable-nodpi ,那么high density device使用-hdpi而不是-nodpi吗?

如果我更进一步,并为-land文件夹设置相同的设置-land

我不确定nodpi的优先级是什么,但这应该永远不会成为问题。 听起来你误解了nodpi资格赛。 您不应该使用nodpi作为设备密度桶中未提供的资产的后备。 正确的回退是没有密度限定符的文件夹(例如drawable/ )。

如果系统无法find设备密度的资产(例如,它是ldpi设备而您没有drawable-ldpi文件夹),它将回退到没有密度限定符的文件夹,*不是nodpi限定符。

当您想要指定将用于所有密度的资源并且您不希望Android扩展时,将使用nodpi限定符。 其他密度文件夹中的资产(例如drawable-xhdpi )将缩放到实际的屏幕尺寸。 如果使用nodpi限定符,则不应在任何其他资源文件夹中提供该资产

同样重要的是要注意,对于屏幕密度限定符,Android还倾向于使用较低密度的资产而不是不合格的资源。 如果你有一个xhdpi设备,但你只有一个drawable和一个drawable-mdpi文件夹,Android将在非限定文件夹之前检查drawable-mdpi文件夹中的资产。

这取决于。 首先, nodpi不是后备文件夹。 如果您有hdpi设备,系统将首先查找hdpi文件夹。 nodpi文件夹包含无意缩放的资源。 drawable/可用作后备文件夹,以防设备密度特定资源不存在。

根据文件 :

表2列出了有效的配置限定符, 按优先顺序排列 – 如果对资源目录使用多个限定符,则必须按照表中列出的顺序将它们添加到目录名称中。


然后,如果我们查看屏幕像素密度限定符值的顺序,则列出如下:

  1. LDPI
  2. MDPI
  3. 华电国际
  4. xhdpi
  5. xxhdpi
  6. xxxhdpi
  7. nodpi (非扩展资源在这里)
  8. tvdpi
  9. anydpi (此文件夹中的资源优先级最高)
  10. nnndpi

注意:您应该将所有这些资源放在您希望缩放drawable-nodpi文件夹中。 为了支持多个屏幕, Android更倾向于缩小较大的原始图像,而不是放大较小的原始图像 。 这些资源不应出现在任何其他drawable-qualifier文件夹中,否则这些资源可能会被缩放,这会破坏整个目的。


必须指出:

使用密度限定符并不意味着资源仅用于该密度的屏幕。 如果您不提供具有更好地匹配当前设备配置的限定符的备用资源,则系统可以使用最匹配的资源。


以下是系统用于查找最佳匹配资源选择流程图

在此处输入图像描述

drawable-nodpi将绕过缩放, drawable将使用默认缩放:

  • mdpi = 1x
  • hdpi = 1.5x
  • xhdpi = 2x
  • xxhdpi = 3x
  • xxxhdpi = 4x
  • 如果你的代码将自己进行缩放(或没有缩放)并且你不希望Android预先缩放图像,那么drawable-nodpi是有效的。

    还有drawable-anydpi ,只是为了让事情更加混乱。

    如果不存在密度和屏幕规格的精确匹配,则将使用没有规格的可绘制drawable-nodpi将在drawable之后使用。

    更新如果您同时具有drawable和drawble-nodpi,则选择顺序是更复杂的规则,未记录或Android已损坏。 通过实验,我确认屏幕密度 = xhdpi的设备将选择drawable-nodpi。

    选择规则:1。选择匹配屏幕密度,其中之一:

    • 绘制,LDPI
    • 绘制,MDPI
    • 绘制,华电国际
    • 绘制,xhdpi
    • 绘制,xxhdpi
    • 绘制,xxxhdpi
    1. 如果密度不匹配,则选择其中一个
    • drawable(自动缩放mdpi = none … xxxhdpi = 4x)
    • drawable-nodpi(无缩放)
    • 绘制,tvdpi
    • drawable-anydpi(无缩放)

    当不需要缩放图像/资产时,使用drawable-nodpi限定符。

    其他密度文件夹(例如drawable-xhdpi)中的可绘制将缩放到实际的屏幕大小。

    drawable-nodpi适用于所有密度设备的恒定尺寸。