【问题标题】:Will a density qualified drawable folder or drawable-nodpi take precedence?密度合格的可绘制文件夹或可绘制nodpi优先吗?
【发布时间】:2014-09-01 03:44:47
【问题描述】:

如果我为density qualified folder 定义可绘制对象(例如drawable-hdpi),并且还可以在drawable-nodpi 中使用可绘制对象,那么high density device 是否会在-nodpi 上使用-hdpi

如果我更进一步,并且对-land 文件夹也有相同的设置,那会怎样。

【问题讨论】:

  • 对于此问题的任何未来查看者:如果您确实想要一个合格的 -land 文件夹,其中还包括 -density,请确保将 -land 放在首位。见this table

标签: android android-resources


【解决方案1】:

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

如果系统在设备的密度下找不到资产(例如,它是 ldpi 设备并且您没有 drawable-ldpi 文件夹),它将回退到没有密度限定符的文件夹,*不是 @ 987654326@限定符`。

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

还需要注意的是,对于屏幕密度限定符,Android 也会更喜欢使用密度较低的资源而不是不合格的资源。如果您有 xhdpi 设备,但您只有一个 drawable 和一个 drawable-mdpi 文件夹,Android 将在不合格文件夹之前检查 mdpi 文件夹中的资产。

【讨论】:

  • 我不太明白drawable-nodpi和drawable的区别。就我而言,我在与父母匹配的 imageView 中有一个背景图像(全屏)。在 drawable 或 drawable-nodpi 中,图像覆盖全屏。因此,在 drawable-nodpi 和 IS 缩放中。有什么意义??
  • ImageView 有点不同——它将获取任何形式的源图像并自行处理缩放。如果您将您的可绘制对象设置为任何视图的背景,您应该观察到正确的行为。我也永远不会将图像放在drawable 文件夹中——它们应该始终放在合格的文件夹中。
  • 你的意思是所有的图片都应该放在一个合格的文件夹里?为什么?如果您有一张充满屏幕的背景图片,您会为每个符合条件的文件夹生成一张图片吗?
  • 通常您希望控制缩放,因此您(或您的设计师)生成一个适合每个密度桶的图像,而不是让系统缩放它。如果背景图像只是纯色,中间带有徽标或其他东西,那么您应该使用背景颜色和较小的居中徽标的组合,而不是单个全屏图像。 drawable-nodpi 仍然是一个合格的文件夹,我只是远离将drawable 用于图像资产(将其用于 XML 资产)。
  • 任何放在drawable 中的文件在加载时都将由系统以与drawable-mdpi 相同的方式处理。所以它可能具有较低的优先级,但结果是相同的。我的建议是永远不要使用drawable,如果您打算使用drawable,只需将内容放入drawable-mdpi
【解决方案2】:

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

  • mdpi = 1x
  • hdpi = 1.5x
  • xhdpi = 2x
  • xxhdpi = 3x
  • xxxhdpi = 4x

    drawable-nodpi 如果您的代码将进行自己的缩放,则效率很高 (或不缩放)并且您不希望图像被 Android 预先缩放。

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

    如果密度和屏幕规格不存在完全匹配,则将使用没有规格的

    drawabledrawable-nodpi 将在drawable之后使用。

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

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

    • 可绘制的 ldpi
    • 可绘制-mdpi
    • 可绘制的 hdpi
    • 可绘制-xhdpi
    • 可绘制-xxhdpi
    • 可绘制-xxxhdpi
    1. 如果密度不匹配,则选择其中一项
    • 可绘制(自动缩放 mdpi=none...xxxhdpi=4x)
    • drawable-nodpi(无缩放)
    • 可绘制-tvdpi
    • drawable-anydpi(无缩放)
  • 【讨论】:

    • drawable 确实可以缩放图像(我切换到 nodpi 文件夹,我发现 xhdpi 设备上的内存监视器提高了 50%)
    【解决方案3】:

    视情况而定。

    首先nodpi 不是备用文件夹。如果您有 hdpi 设备,系统将首先查找hdpi 文件夹。 nodpi 文件夹包含不打算扩展的资源。

    drawable/ 可用作备用文件夹,以防设备密度特定的资源不存在。


    然后,如果我们查看 Screen Pixel Density(dpi) 的可能 限定符值,这些值被列为:

    1. ldpi
    2. mdpi
    3. hdpi
    4. xhdpi
    5. xxhdpi
    6. xxxhdpi
    7. nodpi (非缩放资源到这里)
    8. tvdpi
    9. anydpi (此文件夹中的资源优先级最高)
    10. nnndpi

    注意:您应该将所有希望缩放的资源放在drawable-nodpi 文件夹中。要支持多屏,Android prefers to scale down a larger original image instead of scaling up a smaller original image。这些资源应该出现在任何其他 drawable-qualifier 文件夹中,否则这些资源可能会被缩放,从而违背了整个目的。


    还需要注意的是:

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


    这是系统用来寻找最佳匹配资源选择流程图

    【讨论】:

    • 那是限定符命名规则,不是优先级!!!而且在屏幕像素密度这一行,google只是按照屏幕密度从低到高排序,而不是检索drawable的优先级!!!我很确定如果您使用的是hdpi设备,它将以hdpi为最高优先级,而不是ldpi,您所说的没有意义。
    • @Chandler 你看起来很困惑。我直接引用了非常清晰的 Android 文档。请详细说明你不明白的地方。
    • 不,您似乎很困惑。如果是 hdpi 设备,则 drawable-hdpi 文件夹具有最高优先级。没有必要将 drawable-ldpi 作为最高优先级。
    • @Chandler 对于 hdpi 设备,如果您不提供 drawable-hdpi 资源,系统可能会使用最匹配的资源。正如我之前引用的那样,“如果您不提供具有更匹配当前设备配置的限定符的替代资源,系统可能会使用最匹配的资源。”
    • 基于此,ldpi(最高优先级)。和 tvdpi(最低优先级)绝对不正确。
    【解决方案4】:

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

    其他密度文件夹中的drawable(例如drawable-xhdpi)将被缩放到实际屏幕尺寸。

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

    【讨论】:

    • Re: “drawable-nodpi for constant size ...”。不必要。 drawable-nodpi 的一种可能用途是当您的布局或代码指定目标矩形和缩放方法时,您决定不费心提供多个特定于密度的图像。 (但在速度较慢的手机上测试页面加载性能;如果有明显的延迟,最好提供特定密度的图像。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2014-11-06
    • 1970-01-01
    相关资源
    最近更新 更多