android - 如果使用可绘制对象引用,可绘制对象不会因缺少密度桶而缩放

标签 android drawable scaling android-resources android-drawable

首先,介绍一下我正在做的事情的背景。 如果您熟悉一般的引用(简单概念),请直接跳到第 2 部分

1 密度引用的概念

通常我们在drawable-mdpidrawable-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 可绘制对象,普通可绘制对象也能正常工作:

enter image description here enter image description here enter image description here

A) 如果缺少一个密度引用,引用的可绘制对象将不起作用(我没有在 values-ldpi/refs.xml 中提供明确的变体):

enter image description here enter image description here enter image description here

最佳答案

没关系,我现在在 ldpi 模拟器中进行了测试,它可以正常工作。因此,这是仅影响 IDE 中的布局预览 Pane 的错误之一。

是的,我应该在询问之前在 ldpi 模拟器中进行测试。 :)

关于android - 如果使用可绘制对象引用,可绘制对象不会因缺少密度桶而缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25613487/

相关文章:

android - Lollipop 前层列表中的项目大小不正确

Java 最佳实践 : More detailed class variable in subclass

css - 全视口(viewport)高度缩放 ​​div 只是 css 没有 js ...可能吗?

objective-c - 使用 contentScaleFactor 属性缩放 UITextView

android - ActionBar SearchView 在横向模式下未完全展开

android - 如何获取 react-native WebView 的文本选择?

android - 动画展示适用于 14 岁以上 Android 设备

heroku - 缩小特定的 Heroku worker dynos?

android - 无法解析类型 org.apache.http.Header。它是从所需的 .class 文件中间接引用的

java - 如何将 BEGIN_OBJECT 转换为 BEGIN_ARRAY