原本一切都很好。我一直在使用 5 个可绘制目录
drawable-hdpi
drawable-ldpi
drawable-mdpi
drawable-xhdpi
drawable-xxhdpi
这是我最近创建一个新项目时由 eclipse adt-bundle 为我创建的。因此,当我需要一个新的位图时,我一直将位图的副本放入这 5 个目录中的每一个中。这对我来说总是有点奇怪,所以我很高兴通过阅读Android 文档提供资源发现我可以为所有常见的位图提供一个“可绘制”的单一目录。所以我切换到
drawable
drawable-hdpi
drawable-ldpi
drawable-mdpi
drawable-xhdpi
drawable-xxhdpi
原始 5 个目录中剩下的唯一文件是最初创建项目时为我创建的“ic_launcher.png”文件。
但是,可绘制目录的新配置严重失败。加载 36k 位图文件 frame.png,现在由于该行而发生内存不足错误
bitmap_fancyframe = BitmapFactory.decodeResource(getResources(), R.drawable.frame);
logcat 显示 Android 现在尝试分配一个 6790156 字节的内存块,结果该行(即 logcat 底部提到的 DrawOnTop.java:95 行)
06-01 07:26:53.995: I/dalvikvm-heap(1530): Forcing collection of SoftReferences for 6790156-byte allocation
06-01 07:26:54.025: D/dalvikvm(1530): GC_BEFORE_OOM freed 9K, 14% free 53820K/62343K, paused 27ms, total 27ms
06-01 07:26:54.025: E/dalvikvm-heap(1530): Out of memory on a 6790156-byte allocation.
06-01 07:26:54.025: I/dalvikvm(1530): "main" prio=5 tid=1 RUNNABLE
06-01 07:26:54.025: I/dalvikvm(1530): | group="main" sCount=0 dsCount=0 obj=0x41077508 self=0x40de49a0
06-01 07:26:54.025: I/dalvikvm(1530): | sysTid=1530 nice=0 sched=0/0 cgrp=apps handle=1075179312
06-01 07:26:54.025: I/dalvikvm(1530): | schedstat=( 681383064 1229707806 4777 ) utm=53 stm=14 core=0
06-01 07:26:54.025: I/dalvikvm(1530): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
06-01 07:26:54.025: I/dalvikvm(1530): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623)
06-01 07:26:54.025: I/dalvikvm(1530): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:476)
06-01 07:26:54.025: I/dalvikvm(1530): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:499)
06-01 07:26:54.025: I/dalvikvm(1530): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:529)
06-01 07:26:54.025: I/dalvikvm(1530): at com.example.MyApp.DrawOnTop.<init>(DrawOnTop.java:95)
谁能解释为什么会这样?更重要的是,该 frame.png 文件在我的代码中被缩放和拉伸,所以我真的不需要它的 5 个副本,所以有什么方法可以让我在一个“可绘制”目录中拥有所有常见的 png 位图,而无需这些类型的问题?
更新感谢@sam 的评论和@ken-wolf 的回答,我现在了解到,如果没有正确类型的位图,Android 会进行大量位图缩放。所以当我简单地在所有目录之间复制相同的位图时,我的新理解是这样做的效果是位图将被加载而不缩放。对我来说,在扩展过程中显然出了点问题,但是由于我正在自己进行扩展,所以我也不需要 Android 来做这件事。所以我现在认为重要的问题是:如何设置我的应用程序以便只提供每个位图的一个版本,并指示 Android 不要进行任何位图缩放。