7

我是否正确理解这一点:

所有 android 设备都属于以下 4 个密度桶之一:ldpi、mdpi、hdpi、xhdpi。

因此,如果为这些密度中的每一个提供了可绘制资源(每个文件夹中都存在可绘制或具有相同名称的可绘制资源),则无需在 /res/drawable 或 / 中提供具有相同名称的可绘制资源res/drawable-nodpi。

我的理解正确吗?

那么,为什么在 /res/drawable 中提供相同的资源是有意义的唯一原因是,如果为 Android OS 定义了新的密度桶,则可以使应用程序更加面向未来?

4

3 回答 3

24

我的理解正确吗?

通过这一段,你或多或少是正确的。你的下一段有点“脱轨”:

那么,为什么在 /res/drawable 中提供相同的资源是有意义的唯一原因是,如果为 Android OS 定义了新的密度桶,则可以使应用程序更加面向未来?

并不真地。

您将资源放入res/drawable/本质上可扩展的资源(例如, a ShapeDrawable)。您将资源放入res/drawable-nodpi/其中,出于某种原因,您不想被缩放以匹配设备密度。

如果 Android 发明了一个新的密度桶(例如,-uhdpi对于 400dpi 的超高密度),如果你跳过一个密度桶,Android 可能会做它今天所做的事情:缩放你的其他版本之一。例如,如果您有-xhdpi或没有-hdpi,Android 将对-xhdpi图像进行下采样以在-hdpi设备上使用。

于 2012-05-19T20:21:52.270 回答
5

这是正确的,只要您覆盖的所有 4 个密度桶中都有可绘制对象。一种常见的做法是在 /res/drawable 中制作一个自定义可绘制对象,它指的是您的密度跨越可绘制对象。

例如,您可能希望按钮具有不同的按下和未按下状态。首先,您将为按下和未按下的按钮包含每个密度的可绘制对象。然后您可以在 /res/drawables 中创建以下 button_black_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false"
        android:drawable="@drawable/button_black"/>

    <item android:state_pressed="true"
        android:drawable="@drawable/button_black_selected" />

</selector>
于 2012-05-19T20:28:37.413 回答
0

如果为所有四种密度添加了资源,那么您不必可绘制对象添加到文件夹是正确的/res/drawable。但是,您猜对了,如果出现新的限定符,最好在默认文件夹中包含一些内容。因此,我建议不要将 mdpi 资源放置到/res/drawable-mdpi文件夹中,而是放置到默认文件夹中 ( /res/drawable/)。对于每种资源来说,这都是一个很好的做法。

至于/res/drawable-nodpi文件夹,它是一个特殊的文件夹,因为它应该包含不像所有其他限定符那样自动扩展的资源。因此,您通常要么/res/drawable-nodpi单独使用该文件夹,要么根本不使用它。

于 2012-05-19T20:22:31.410 回答