Android LiveWallper:高效加载和绘制各种位图(例如:视频)

Android LiveWallper:高效加载和绘制各种位图(例如:视频),android,bitmap,load,live,wallpaper,Android,Bitmap,Load,Live,Wallpaper,我正在开发一种在背景上复制动画(如短片)的实时壁纸 有人知道如何高效地加载各种全屏大小的位图并在画布上绘制它们吗? 我试过两种方法,但都不是很好 方法1: 在壁纸启动时加载所有位图 问题:内存过剩限制(约35MB)无法加载超过10个位图。因此动画缺少不同的图像 方法2: 仅加载2个位图。在运行时,绘制位图,删除旧位图,加载新位图,然后重复 问题:消耗了大量的系统(不是内存,但通常会降低操作系统的速度),但它仍然可以工作,因为它并没有超过内存限制。但仍然会减慢整个系统的速度 例如: Dra

我正在开发一种在背景上复制动画(如短片)的实时壁纸

有人知道如何高效地加载各种全屏大小的位图并在画布上绘制它们吗? 我试过两种方法,但都不是很好


方法1: 在壁纸启动时加载所有位图

问题:内存过剩限制(约35MB)无法加载超过10个位图。因此动画缺少不同的图像


方法2: 仅加载2个位图。在运行时,绘制位图,删除旧位图,加载新位图,然后重复

问题:消耗了大量的系统(不是内存,但通常会降低操作系统的速度),但它仍然可以工作,因为它并没有超过内存限制。但仍然会减慢整个系统的速度

例如:

  Drawer.drawAll(res,c,p);
  res.removeOldBitmaps();
  res.loadNewBitmaps(wpservice,display);
我考虑的另一种方法是在一个单独的线程上加载资源,你们怎么看?你还有其他解决办法吗


干杯

解决了,我找到的解决方案如下:

在运行时逐个加载图像

并使用以下选项:

/**Effective image decoder by chelin**/
public static Bitmap decodeResource(WallpaperService wpservice,int id){

    int scale=1;
    Resources res = wpservice.getResources();
    BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inPreferredConfig = Bitmap.Config.ARGB_8888;
    o2.inSampleSize=scale;
    o2.inPurgeable = true;
    o2.inInputShareable = true;
    return BitmapFactory.decodeResource(res, id, o2);
}

希望它能像对我一样起作用。干杯

您也只能使用一个位图。如果您将图像作为字节数组(例如png压缩)预加载到内存中,并且一次只解码一个图像,就可以实现这一点。与从资源加载相比,这至少应该将解码过程加快一点。但是如果你喜欢视频,为什么不制作一个视频并使用MediaPlayer呢?嘿,这是个好主意,我会试试看是否有任何改进。不,我不能在现场壁纸上使用媒体播放器,我不知道这是否可行,即使可行,我也计划制作一些动画。感谢您的回复。我在这里找到了一篇类似的帖子,其中有一个有趣的问题,但我还没有尝试过:为了防止您对尝试MediaPlayer方法感兴趣,至少在OpenGL ES 2.0和SurfaceTexture(仅限API 11+)中是可行的。如果没有OpenGL,我不知道是否有可能让MediaPlayer将其内容呈现在墙纸表面。哦,谢谢,我会看一看。不过,我希望墙纸可以从API 9中工作。如果您不关心透明度,可以使用Bitmap.Config.RGB_565节省内存