Android实时壁纸动画

Android实时壁纸动画,android,live-wallpaper,Android,Live Wallpaper,将动画显示为实时壁纸的最佳方式是什么?现在我有一个gif分割成11个PNG(每帧一个),然后我就这样做 public Bitmap frame0; ArrayList<Bitmap> frameArray = new ArrayList<Bitmap>(); frame0 = BitmapFactory.decodeResource(getResources(), R.drawable.nyancat0); frame0 = Bitmap.createScaledBitm

将动画显示为实时壁纸的最佳方式是什么?现在我有一个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);
然后我只需改变我的indexnumber+,除非它是11,然后我回到1。
这是可行的,但当然,存储这么多位图的内存效率非常低。这阻止了我在没有滞后和电池消耗的情况下进行多层或其他冷却效果。有没有更好的方式在Android Live壁纸上显示动画?我尝试使用电影来显示整个GIF,但实时壁纸不支持这种方式。

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


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

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


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

不管人们怎么说,你的实时壁纸中实际上可以有很多图像。唯一棘手的是内存限制。我的应用程序中加载了多达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,这将需要额外的内存

我从来没有想过这类应用程序的内存上限是多少,是不是内存堆限制通常等于24MB,但我可以告诉你,我的应用程序占用了13MB的内存,而且从来没有人报告过Android设备上发生故障>=2.2


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

不管人们怎么说,您的实时壁纸中实际上可以有很多图像。唯一棘手的是内存限制。我的应用程序中加载了多达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,这将需要额外的内存

我从来没有想过这类应用程序的内存上限是多少,是不是内存堆限制通常等于24MB,但我可以告诉你,我的应用程序占用了13MB的内存,而且从来没有人报告过Android设备上发生故障>=2.2


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

我将尝试一下,并让您知道它是如何运行的!现在你提到了这个非常简单的想法…我会尝试一下,让你知道它是怎么回事!现在你提到了一个非常简单的想法。。。