【发布时间】:2014-09-01 22:16:00
【问题描述】:
首先,关于我正在做的事情的一些背景知识。 如果您对一般参考资料(简单概念)很熟悉,请直接跳到第 2 节。
1 密度参考的概念
通常,我们在drawable-mdpi、drawable-hdpi等文件夹中使用drawable。示例:
/drawable-mdpi
./figure.png (24x24 pixels)
/drawable-hdpi
./figure.png (36x36 pixels)
[...]
但是,实现(相同?)行为的另一种方法是在 drawable-nodpi 内部定义相同的可绘制对象,具有不同的大小,然后通过可绘制引用引用 values-mdpi、values-hdpi 等中的每个大小。示例:
/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 将检索最高密度的可绘制变量,但不会根据该密度调整它的大小。 p>
让我举个例子让你更清楚:如果使用引用的drawable,我省略了values-ldpi/refs.xml,Android 将从values-xxhdpi(我为这个任意drawable 提供的最高值)检索drawable,并在大小对应于 xxhdpi,而不是 ldpi,因为它应该。因此,在 ldpi 设备中显示的任何布局都将具有巨大的图像。见下图:
A) 即使缺少 LDPI 可绘制对象,普通可绘制对象也能正常工作:
A) 如果缺少一个密度参考,则参考的可绘制对象不起作用(我没有在 values-ldpi/refs.xml 中提供明确的变体):
【问题讨论】:
-
您如何使用这些资源?
android:src布局中的引用?android:background布局中的引用?通过 Java 代码中的某些东西或其他东西?还有什么? -
Hi Mark,这些例子是通过 ImageViews 中的 src 标签实现的。
-
查看问题跟踪器,根据 Google,this should not work at all。我无法解释为什么您看到它在某些情况下有效,但在其他情况下无效。
-
@CommonsWare 没关系,它适用于设备/模拟器。它只发生在设计时,即在 Studio 中预览布局时。顺便说一句,我认为这个人没有正确解释这个问题(或者完全是另一个问题)。正如我们所看到的,他提到了可绘制文件夹本身的别名(可能是某种软链接文件),因为他从未提到使用
values引用。恕我直言,这并不完全清楚,因此为什么该问题首先被标记为“NeedsInfo”。感谢您的帮助。
标签: android drawable scaling android-resources android-drawable