不管人们怎么说,你实际上可以在你的动态壁纸中有很多图像。唯一棘手的是内存限制。我的应用程序中加载了多达 40 个 .png,我每分钟重新加载一次。
但是当您在应用程序中处理这么多图像时,您必须以一种智能的方式加载它们:
public BitmapResult decodeResource(int file, int scale){
//Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inPurgeable = true;
o.inInputShareable = true;
o.inJustDecodeBounds = true;
BitmapFactory.decodeResource(resources, file, o);
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inPreferredConfig = Bitmap.Config.ARGB_8888;
o2.inSampleSize=scale;
return new BitmapResult(BitmapFactory.decodeResource(resources, file, o2),o2.outWidth,o2.outHeight);
}
你看到那个比例变量了吗?它应该是 2 的幂,它会缩小位图。
如果出现问题,请清理位图并重新加载质量较低的位图:
void init()
{
try
{
loadFirstBitmap();
loadSecondBitmap();
}
catch(java.lang.OutOfMemoryError error)
{
/*some infinite loop breaker*/
scale *= 2;
cleanup();
init();
}
}
此外,系统不会为您删除位图,您必须自己清理它们,然后可能会调用垃圾收集器:
bitmap1.recycle();
bitmap2.recycle();
System.gc();
将位图调整为所需的大小也是一个好主意,否则系统可能会在您每次尝试绘制它时调用 createScaledBitmap,这将需要额外的内存。
我从来没有想过这类应用程序的内存上限是多少,内存堆限制通常等于 24 MB,但我可以告诉你,我的应用程序占用了 13 MB 内存,而且没有人报告过崩溃在 Android 设备上 >= 2.2。
因此,如果您遵循一些优化规则,您可以根据需要在应用程序中加载尽可能多的位图。