2012-04-12 135 views
1

将动画显示为动态壁纸的最佳方式是什么?现在我有一个GIF分成11个png格式(每帧),然后我只是在做Android动态壁纸动画

public Bitmap frame0; 
ArrayList<Bitmap> frameArray = new ArrayList<Bitmap>(); 
frame0 = BitmapFactory.decodeResource(getResources(), R.drawable.nyancat0); 
frame0 = Bitmap.createScaledBitmap(frame0, minWidth, minHeight, true); 
frameArray.add(frame0); 

然后,我只是通过帧使用for循环中循环,并吸引他们在画布上

canvas.drawBitmap(frameArray.get(indexnumber), 0, 0, mPaint); 

然后我只是改变我的索引号++,除非它是11,然后我回到1. 这是有效的,但是当然,存储很多Bitmap是非常低效的内存。这阻止了我做多层或其他很酷的效果,没有滞后和电池消耗。有没有更好的方式在Android动态壁纸上显示动画?我试过电影显示整个GIF,但不支持动态壁纸。

回答

1

加载图像需要多长时间?如果它可以忽略不计,那么为什么不显示它之前加载每个图像,丢弃旧图像?这样,你在任何一个阶段只有1张图像在内存中。

或者做一些类似于使用后台缓冲区的东西,在内存中有两个空格,一个用于现在显示的图像,另一个用于加载下一个图像。当需要更改时,使新加载的位图可见,卸载另一个,然后将下一帧加载到该位置。

+0

我会试一试,让你知道它是怎么回事!现在你提到它非常简单 – NightmareApps 2012-04-13 00:00:52

0

尽管人们说,你实际上可以在你的动态壁纸中有很多图像。唯一棘手的是内存限制。我的应用程序中装载了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。

因此,如果您遵循一些优化规则,则可以根据需要在应用程序中加载尽可能多的位图。