首先,介绍一下我正在做的事情的背景。 如果您熟悉一般的引用(简单概念),请直接跳到第 2 部分。
1 密度引用的概念
通常我们在drawable-mdpi
、drawable-hdpi
等文件夹中使用drawable。示例:
/drawable-mdpi
./figure.png (24x24 pixels)
/drawable-hdpi
./figure.png (36x36 pixels)
[...]
但是,实现(相同?)行为的另一种方法是在 drawable-nodpi
中定义不同尺寸的相同 drawable,然后在 values-mdpi< 中引用每个尺寸
、values-hdpi
等通过 drawable 引用。示例:
/drawable-nodpi
./figure_24.png
./figure_36.png
/values-mdpi
./refs.xml
/values-hdpi
./refs.xml
每个 refs.xml
文件都应该包含这样的行(例如 /values-mdpi/refs.xml
):
<item name="figure"
type="drawable">@drawable/figure_24</item>
那样的话,您可以像没有引用一样引用相同的 R.drawable.figure
。当您需要在不调整大小的情况下处理不同尺寸的相同图像(例如,在 24/36/48/72 和 48/72/96/144 中使用相同的图像)时,我发现这很有用,因为您可以引用相同的图像两次(例如,48 和 72 像素图像)而不复制图像(从而避免膨胀的 apk 大小)。
2 如果缺少一个密度引用则不起作用
众所周知,Android 不需要所有桶密度来正确显示可绘制对象 [ 1 ].例如,您可以完全省略 drawable-ldpi
,它会加载并缩放其他drawable-*
文件夹中的那些,并在测试密度中的适当尺寸。事实上,许多应用程序(包括来自 Google 的应用程序)已经省略了 ldpi 并且没有人注意到。
但是,我注意到,当使用可绘制对象引用时(请参阅上面的第 1 节),此行为会发生变化。如果我省略密度文件夹中的引用 xml 文件,并尝试以该密度显示该可绘制对象,Android 将检索最高密度可绘制对象变体,但不会根据该密度调整它的大小。
让我举个例子让你更清楚:如果使用引用的可绘制对象,我省略了 values-ldpi/refs.xml
,Android 将从 values-xxhdpi< 检索可绘制对象
(我为这个任意可绘制对象提供的最高值)并以与 xxhdpi 对应的大小显示它,而不是 ldpi,因为它应该。因此,在 ldpi 设备中显示的任何布局都将具有巨大的图像。见下图:
A) 即使缺少 LDPI 可绘制对象,普通可绘制对象也能正常工作:
A) 如果缺少一个密度引用,引用的可绘制对象将不起作用(我没有在 values-ldpi/refs.xml
中提供明确的变体):
最佳答案
没关系,我现在在 ldpi 模拟器中进行了测试,它可以正常工作。因此,这是仅影响 IDE 中的布局预览 Pane 的错误之一。
是的,我应该在询问之前在 ldpi 模拟器中进行测试。 :)
关于android - 如果使用可绘制对象引用,可绘制对象不会因缺少密度桶而缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25613487/