【问题标题】:If a drawable resource is provided for ldpi, mdpi, hdpi, xhdpi, this drawable does not need to provided for nodpi?如果为ldpi、mdpi、hdpi、xhdpi提供了drawable资源,这个drawable不需要为nodpi提供吗?
【发布时间】:2012-05-19 20:12:59
【问题描述】:
我是否理解正确:
所有 android 设备都属于以下 4 个密度桶之一:ldpi、mdpi、hdpi、xhdpi。
因此,如果为这些密度中的每一个都提供了可绘制资源(每个文件夹中都存在可绘制或具有相同名称的可绘制资源),则无需在 /res/ 中提供具有相同名称的可绘制资源可绘制或 /res/drawable-nodpi。
我的理解正确吗?
那么,在 /res/drawable 中提供相同资源有意义的唯一原因是,如果为 Android 操作系统定义了新的密度桶,则可以使应用更加面向未来?
【问题讨论】:
标签:
android
resources
drawable
【解决方案1】:
我的理解正确吗?
通过这一段,你或多或少是正确的。你的下一段有点“脱轨”:
那么,在 /res/drawable 中提供相同资源有意义的唯一原因是,如果为 Android 操作系统定义了新的密度桶,则可以使应用更加面向未来?
不是。
您将资源放在res/drawable/ 中,这些资源本质上是可扩展的(例如,ShapeDrawable)。您将资源放在 res/drawable-nodpi/ 中,出于某种原因,您不想被缩放以匹配设备密度。
如果 Android 发明了一个新的密度桶(例如,-uhdpi 用于 400dpi 的超高密度),如果您跳过一个密度桶,Android 可能会做今天所做的事情:缩放您的其他版本之一。例如,如果您有-xhdpi 而没有-hdpi,Android 将对-xhdpi 图像进行下采样,以便在-hdpi 设备上使用。
【解决方案2】:
这是正确的,只要您覆盖的所有 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>
【解决方案3】:
如果为所有四种密度添加了资源,那么您是正确的,您没有 将可绘制对象添加到文件夹/res/drawable。但是,您猜对了,如果出现新的限定符,最好在默认文件夹中包含一些内容。因此,我建议不要将 mdpi 资源放置到 /res/drawable-mdpi 文件夹,而是放置到默认文件夹 (/res/drawable/)。这对每种资源都是一种很好的做法。
至于/res/drawable-nodpi 文件夹,它是一个特殊的文件夹,因为它应该包含不像所有其他限定符那样自动扩展的资源。因此,您通常要么单独使用/res/drawable-nodpi 文件夹,要么根本不使用它。