1

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

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);

然后我只是更改我的 indexnumber++,除非它是 11,然后我回到 1。这行得通,但是当然,存储这么多位图的内存效率非常低。这使我无法在没有滞后和电池消耗的情况下进行多层或其他很酷的效果。有没有更好的方法在 Android 动态壁纸上显示动画?我尝试使用电影来显示整个 GIF,但动态壁纸不支持。

4

2 回答 2

1

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

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

于 2012-04-12T23:58:54.163 回答
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。

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

于 2012-05-20T21:07:32.640 回答