关于 android 个可绘制文件夹的说明
Clarifications about android drawable folders
到现在为止,我并没有过多关注如何存储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 将为以其他密度运行的设备对图像进行上采样或下采样。
选项 #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?
可能不会。您的图标的大幅缩小版本不太可能看起来非常好。
到现在为止,我并没有过多关注如何存储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 将为以其他密度运行的设备对图像进行上采样或下采样。
选项 #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?
可能不会。您的图标的大幅缩小版本不太可能看起来非常好。