关于Android可绘制文件夹的说明

时间:2018-07-21 17:20:14

标签: android android-drawable android-resources

直到现在,我还没有太在意如何存储可绘制资源。

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

但是,我最近遇到了一个与之相关的问题,引起了我的全部注意。我在drawable文件夹下存储了100KB的图像。但是,我的应用程序经常崩溃,并指出它无法分配18MB!

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

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

我已经进行了大量搜索,但是关于该主题的资源有限或不清楚,因此官方文档确实很糟糕。 我知道drawabledrawable-nodpi的官方解释,但并不能阐明所有内容。

通常:

  • 缩放如何工作?假设我有res/drawable-mdpi/image.png。如果我的屏幕不同于mdpi,这是否意味着会缩放图像,还是会在mdpi的屏幕上缩放图像,从而导致每个设备上的图像尺寸可能都会变大?
  • 根据上一个问题,如果图像不是针对mdpi屏幕缩放,而是针对任何其他屏幕缩放,那么这是否意味着如果我针对每种屏幕密度都提供该图像的版本,那么缩放将永远不会发生吗?或相反,如果图像也在mdpi设备上缩放,那么对于每个屏幕密度具有相同版本的同一图像仍会缩放图像,但使用与设备屏幕密度匹配的图像版本吗? li>
  • 如何处理我没有多个版本的图标?恐怕如果将单个版本放在mdpi中,它只会对其进行缩放并使用比必要数量更多的内存。在这种情况下,我应该在nodpi下放置没有其他版本的图标吗?
  • 另一方面,如果每当将图像放在mdpihdpi中时,...即使在密度匹配的设备上也可以缩放图像,那么我应该将所有内容移动到{{1 }}或诸如nodpi之类的高分辨率图片,只能将其缩小比例?

谢谢

1 个答案:

答案 0 :(得分:2)

  

假设我有res / drawable-mdpi / image.png。如果我的屏幕与mdpi不同,是否表示图像已缩放

是的

  

还是会在mdpi屏幕上缩放它,导致每台设备上的图像尺寸可能更大?

否。

  

如果我为每种屏幕密度都提供此图像的版本,那么缩放将永远不会发生吗?

是的。由于可绘制的7个副本,您的APK会更大。

  

如何处理我没有多个版本的图标?

选项#1:确定特定版本所属的密度,然后放在那里。对于以其他密度运行的设备,Android会对该图像进行升采样或降采样。

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

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

决策既要基于内存消耗,又要基于结果。看起来很糟糕的低内存解决方案不太可能是一个不错的选择。

  

我应该将所有内容移动到nodpi下

可能不是。

  

或诸如xxxhdpi之类的高分辨率只能缩小比例?

可能不是。图标的大规模缩小版本不太可能看起来很好。