处理大位图(平铺小位图以创建壁纸)

时间:2010-10-26 10:39:38

标签: android memory views bitmap

我遇到了内存问题,并认为这可能与创建大型位图有关。

手头的任务是获得一个相当小的平铺图像并创建一个更大的平铺图像并将其设置为手机壁纸。我这样做的方式是:

  

1)创建一个2 *屏幕宽度,1 *屏幕高度

的视图      

2)将视图背景设置为BitmapDrawable,并将tile模式设置为repeat

     

3)使用视图尺寸

创建一个位图      

4)通过以下方式将视图绘制到位图:view.draw(new Canvas(bitmap))

     

5)设置wallpper:getApplicationContext()。setWallpaper(bitmap)

这在我的手机(HTC Magic)和我试过的其他手机上运行良好。但我收到有关此问题的错误报告。我尝试通过将所需尺寸加倍来重新创建问题,并且当视图被绘制到位图时,问题似乎发生在第4步中:

  

ERROR / dalvikvm-heap(124):需要堆按摩(7372800字节外部分配太大)

我不知道如何解决这个问题。请帮忙! 感谢

4 个答案:

答案 0 :(得分:1)

我确定你已经想到了,但不过:你有没有

<uses-permission android:name="android.permission.SET_WALLPAPER" />
在你的清单文件中

你确定没有抛出异常吗?显示Toast可能会出现问题。

答案 1 :(得分:1)

不确定这是否是您的解决方案,但您看过了吗? BitmapFactory.Options.inTempStorage

您使用它的方式是:


BitmapFactory.Options options = new BitmapFactory.Options();
options.inTempStorage = new byte[16*1024];
Bitmap bitmap_origin = BitmapFactory.decodeFile(path, options);

答案 2 :(得分:0)

不幸的是,我觉得你不能做太多......我们在这里的手机上; Android将进程内存限制为16MB。

以下是我可以给你的一些提示和技巧(因为我的申请中有同样的问题)

  • 您确定需要32位像素吗?这是三个8位彩色通道加上一个8位alpha通道。您可以使用RGB_565获得视觉上可接受的结果。

  • 回收创建位图时不需要的图像(并且不需要绘制位图)

  • null您不需要的任何其他对象

  • 在创建Bitmap

  • 之前运行System.gc()强制进行垃圾回收

希望这有帮助!

答案 3 :(得分:0)

实际上你可以重构你的代码。如果不使用View

,您将获得更好的性能并可能使用更少的内存
  1. 创建所需尺寸的Bitmap bitmap = Bitmap.createBitmap(width,height,Bitamp.Config.RGV_565)(或ARGB_8888,也可能有效)
  2. 创建canvas = new Canvas(bitmap)
  3. 自己src
  4. 创建平铺图像

    简化代码:

    // set another matrix if you want rotation/scaling of the input
    Matrix identity=new Matrix(); 
    for (int i=0; i<maxLines; i++) {
      for (int j=0; j<maxCol; j++) {
        canvas.draw(src, identity,anyPaint);
      }
    }
    

    保留结束设置壁纸getApplicationContext().setWallpaper(bitmap)