关于 android 个可绘制文件夹的说明

Clarifications about android drawable folders

到现在为止,我并没有过多关注如何存储drawable资源。

我通常生成一个图标的多个版本并将它们存储在drawable-mdpidrawable-hdpidrawable-xhdpi、...文件夹下。 对于我没有多个版本的其他图像,我将它们不一致地存储在 drawable-nodpidrawable.

然而,最近我遇到了一个相关的问题,引起了我的注意。我在 drawable 文件夹下存储了一张 100KB 的图像。但是,我的应用经常崩溃,提示无法分配 18MB!

经过一些搜索,原因是图像被缩放以适应屏幕分辨率,导致图像更重。解决方法是将其移动到 drawable-nodpi 文件夹下,以防止缩放。

所以现在,我正在努力更好地了解我应该在哪里放置我的图像,以及这种缩放效果如何在这方面优化我的应用程序。

我进行了大量搜索,但该主题的资源有限或不明确,而且官方文档真的很糟糕。 我知道 drawabledrawable-nodpi 的官方解释,但它并没有阐明所有内容。

通常:

谢谢

Let's say I have res/drawable-mdpi/image.png. Does that mean the image is scaled if I have a screen different from mdpi

是的。

or will it also be scaled on mdpi screens resulting in possibly heavier image size on every device?

没有

if I provide a version of this image for every screen density, the scale will never happen?

是的。由于 drawable 有 7 个副本,您的 APK 会更大。

How to deal with icons for which I do not have multiple versions?

选项 #1:确定特定版本所属的密度,并将其放在那里。 Android 将为以其他密度运行的设备对图像进行上采样或下采样。

选项 #2:将其设为 in -anydpi or -nodpi,在这种情况下 Android 将不会对其进行上采样或下采样。但是,在这种情况下,您需要自己控制图像的大小(例如,在 ImageView)。

选项 #3:将图标替换为您拥有所有相关密度的图标,或者使用 Android Studio 中的矢量资产向导导入时用作矢量可绘制对象的 SVG 图标。

决策需要同时基于内存消耗和结果。看起来很糟糕的低内存解决方案不太可能是一个好的选择。

should I just move everything under nodpi

可能不会。

or some high resolution like xxxhdpi where it can only be downscaled?

可能不会。您的图标的大幅缩小版本不太可能看起来非常好。