到现在为止,我并没有过多关注如何存储drawable资源。
我通常会生成一个图标的多个版本并将它们存储在drawable-mdpi
、drawable-hdpi
、drawable-xhdpi
下。 ..文件夹。
对于我没有多个版本的其他图像,我将它们不一致地存储在 drawable-nodpi
或 drawable
下。
然而,我最近遇到了一个相关的问题,引起了我的所有关注。我在 drawable
文件夹下存储了一张 100KB 的图像。但是,我的应用经常崩溃,提示无法分配 18MB!
经过一些搜索,原因是图像被缩放以适应屏幕分辨率,导致图像更重。解决方法是将其移动到 drawable-nodpi
文件夹下,以防止缩放。
所以现在,我正试图更好地了解我应该在哪里放置我的图像,以及这种缩放效果如何在这方面优化我的应用。
我进行了大量搜索,但该主题的资源有限或不清楚,而且官方文档真的很糟糕。
我知道官方对 drawable
或 drawable-nodpi
的解释,但它并没有阐明所有内容。
通常:
- 缩放是如何工作的?假设我有
res/drawable-mdpi/image.png
。这是否意味着如果我的屏幕与 mdpi 不同,图像会被缩放,或者它是否也会在 mdpi 屏幕上缩放,从而导致每台设备上的图像尺寸可能更大? - 根据上一个问题,如果图像未针对
mdpi
屏幕缩放但针对任何其他屏幕缩放,那么这是否意味着如果我为每个屏幕密度提供此图像的一个版本,则缩放比例将永远不会发生?或者相反,如果图像也在 mdpi 设备上缩放,那么对于每个屏幕密度具有相同图像的不同版本仍然会缩放图像,但使用与设备屏幕密度匹配的图像版本?< - 如何处理我没有多个版本的图标?恐怕如果我将这个单一版本放在
mdpi
中,它只会缩放它并使用比必要更多的内存。在这种情况下,我是否应该将我没有不同版本的任何图标放在nodpi
下? - 另一方面,如果每当您将图像放入
mdpi
、hdpi
时,即使在与密度匹配的设备上,它也会缩放它,那么我应该只将所有内容移动到nodpi
或某些高分辨率(如xxxhdpi
)只能缩小的地方?
谢谢
最佳答案
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 将为以其他密度运行的设备对图像进行上采样或下采样。</p>
选项#2:把它写成in -anydpi
or -nodpi
,在这种情况下,Android 不会对其进行上采样或下采样。但是,在这种情况下,您需要自己控制图像的大小(例如,在 ImageView
中)。
选项 #3:将图标替换为您拥有所有相关密度的图标,或者使用 Android Studio 中的矢量 Assets 向导导入时用作矢量可绘制对象的 SVG 图标。
决策需要基于内存消耗和结果。看起来很糟糕的低内存解决方案不太可能是一个好的选择。
should I just move everything under nodpi
可能不会。
or some high resolution like xxxhdpi where it can only be downscaled?
可能不会。图标的大幅缩小版本不太可能看起来非常好。
关于android - 关于 android 可绘制文件夹的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51458461/