8

我正在尝试理解http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources,我想知道是否有可绘制和可绘制-ldpi 的点?我问的原因是因为我从不同的示例中复制了一些可绘制对象。我在 drawable-mdpi、drawable-hdpi、drawable-xhdpi 中有 Holo 主题的图标,但启动器图标也存在于 drawable-ldpi 中(但是在 drawable-ldpi 中没有其他文件)。我还有几个只存在于可绘制目录中的自定义可绘制对象。

这是一个例子:

res/drawable/x.png
res/drawable-ldpi/ic_launcher.png
res/drawable-mdpi/ic_launcher.png
res/drawable-mdpi/ic_download.png
res/drawable-hdpi/ic_launcher.png
res/drawable-hdpi/ic_download.png
res/drawable-xhdpi/ic_launcher.png
res/drawable-xhdpi/ic_download.png
res/drawable-xxhdpi/ic_launcher.png

我是否正确理解这是一个错误的配置,就好像我的应用程序恰好在 ldpi 设备上运行它会崩溃,因为它缺少 ic_download 可绘制对象?那么正确的解决方案是什么?我是否必须将所有可绘制对象的大小调整为 ldpi?或者我应该将每个可绘制的最小现有版本添加到可绘制/以安全起见?

4

5 回答 5

17

只有 10% 的设备是 ldpi,而且这个数字会随着时间的推移而减少。来源:http: //developer.android.com/about/dashboards/index.html

不需要所有密度的图像,只要一个就足够了。系统将在需要时按比例放大/缩小。因此,最好的方法是支持最高密度的图像(xhdpi 或 xxhdpi)。

我个人只使用 xhdpi 图像!


如果您将所有图像放在 xhdpi 文件夹中,应用程序不会因为丢失其他密度的图像而崩溃。对于所有其他密度,图像将被调整为更小的尺寸,因此它不会失去其特征。

当您为每种分辨率创建不同的图像而不只是调整其大小时,Google 的建议很有用。示例:ldpi 图标 (36x36) = 只有一个简单的棒球 / xhdpi 图标 (96x96) = 一个球棒击中棒球

更详细一点,如果您将图像放在默认文件夹 (mdpi) 上,它将为 xhdpi 设备放大 2 倍,您可能会遇到 OOM 问题。如果将图像放在 xhdpi 文件夹中,它将缩小一半。

在实践中它不是必需的,但是如果您想要(非常?)小的性能改进并且您不介意更大的 APK,您可以添加它们。

于 2013-06-06T17:50:28.297 回答
1

在 ldpi 设备中,如果在 drawable-ldpi 文件夹中找不到合适的可绘制对象,您的应用将从可绘制文件夹中检索可绘制对象,但是如果可绘制对象太大,则可能会导致 OutOfMemoryError。这就是为什么你应该使用 drawable-ldpi 文件夹和适当调整大小的可绘制对象。

于 2013-06-06T17:17:31.097 回答
1

当 Eclipse 创建启动器图标时,它只会为 mdpi、hdpi、xhdpi 和 xxhdpi 创建它们。基于此,我假设不需要创建 ldpi 图标,并且 mdpi 将自动缩小

于 2013-06-06T17:19:17.370 回答
1

让我解释一下文件夹的层次结构是如何工作的,以及为什么在正确的文件夹中设置正确的图像很重要。

android 选择文件的方式是基于运行应用程序像素密度的设备,它将以该密度(例如 hdpi)开始,如果它没有找到那里的资源,它将沿着整个层次结构向下直到“默认" drawable,你可能会在不同密度的文件夹中丢失资源,操作系统不会抱怨,但是如果在默认文件夹中找不到资源,那么操作系统会告诉你有问题,有一些很难找到相关的错误对于这个问题,让我举个例子,假设您只有在 drawable-hdpi 文件夹中有一个资源,编译器不会抱怨,因为有一个具有您指定的 ID 的资源,如果您在 hdpi 设备上运行应用程序,您将没有任何问题,但是如果应用程序在 ldpi 设备上运行,该应用程序将崩溃,因为操作系统将尝试在 ldpi 文件夹中找到它,然后在默认情况下,并且它们都不包含导致崩溃的资源,这就是为什么大多数人只是跳过该部分并将所有内容设置在“drawable”(默认文件夹)中,因为操作系统将始终在那里找到它,无论您正在处理什么密度,但这里要考虑的重要一点是,当您没有适当的像素密度的适当资源时,操作系统本身会尝试对仅因为计算而发现占用大量内存的唯一资源进行“调整大小”,在我工作的一个项目中,没有适当的资源来保证适当的像素密度导致 OutOfMemoryError,因为操作系统正在调整所有的大小资产几乎没有空间进行其他操作...

问候!

于 2013-06-06T17:32:22.257 回答
0

值得一提的是,如果您查看 KitKat 的 AOSP 源代码,一些内置应用程序不再具有 LDPI 资源。因此,我会说,不,它们不再需要了。

于 2014-03-28T18:08:05.653 回答