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

标签 android android-drawable android-resources

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

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

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

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

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

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

通常:

  • 缩放是如何工作的?假设我有 res/drawable-mdpi/image.png。这是否意味着如果我的屏幕与 mdpi 不同,图像会被缩放,或者它是否也会在 mdpi 屏幕上缩放,从而导致每台设备上的图像尺寸可能更大?
  • 根据上一个问题,如果图像未针对 mdpi 屏幕缩放但针对任何其他屏幕缩放,那么这是否意味着如果我为每个屏幕密度提供此图像的一个版本,则缩放比例将永远不会发生?或者相反,如果图像也在 mdpi 设备上缩放,那么对于每个屏幕密度具有相同图像的不同版本仍然会缩放图像,但使用与设备屏幕密度匹配的图像版本?<
  • 如何处理我没有多个版本的图标?恐怕如果我将这个单一版本放在 mdpi 中,它只会缩放它并使用比必要更多的内存。在这种情况下,我是否应该将我没有不同版本的任何图标放在 nodpi 下?
  • 另一方面,如果每当您将图像放入 mdpihdpi 时,即使在与密度匹配的设备上,它也会缩放它,那么我应该只将所有内容移动到 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/

相关文章:

android - 如何在按钮中创建简单的可绘制图层

Android:强制使用 Wi-Fi 作为位置提供者

android - 无法在android studio中运行应用程序

android - 想在 Button 上添加图标,drawableTop 在 Android 上不起作用

android - 如何在 Android Studio 中获取 Android 图标?

android - 这是从 fragment 中获取字符串资源的正确方法吗?

android - 通用布局,不同资源

android - 将文件名的 ArrayList 转换为 Android 资源

javascript - 删除带有类名的 div

android - Tensorflow:DecodeJpeg 方法在桌面和移动设备上为同一图像提供不同的像素值