在画布上绘图时出现内存不足问题

时间:2017-05-15 12:24:29

标签: android out-of-memory drawing android-canvas android-bitmap

我正在制作一个绘图应用程序,用户可以在其中绘制一些基本形状,如方形,三角形,直线和自由手绘图。

我创建了一个自定义视图,用户可以在其中绘制任何内容。当用户选择任何形状时,我正在创建自定义视图的新实例。并将该视图添加到根布局视图中。

添加几个形状后,应用程序崩溃。根据我的观察,onSizeChanged()方法制作设备宽度和高度的位图。如果我在高分辨率设备上工作,它可能是一个很大的位图。

问题1:每次在画布上绘制是否需要生成位图?

问题2:如何避免和处理内存不足的问题?

`

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) 
{
super.onSizeChanged(w, h, oldw, oldh);
canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
drawCanvas = new Canvas(canvasBitmap);
}

`

我在许多绘图示例中看到,他们正在制作位图实例并在画布上绘制它。为什么需要它?

https://code.tutsplus.com/tutorials/android-sdk-create-a-drawing-app-touch-interaction--mobile-19202

2 个答案:

答案 0 :(得分:0)

您在完成绘图后尝试在recycle()上调用bitmap方法,这对我有很大帮助,使用recycle()方法,

  

释放与此位图关联的本机对象,然后清除   参考像素数据。这不会释放像素数据   同步;它只是允许它被垃圾收集,如果有的话   没有其他参考..

请考虑阅读此官方文档here

答案 1 :(得分:0)

  

问题1:每次在画布上绘制是否需要生成位图?

如果您不需要关心位图并且只想向用户显示图形,则无需每次都生成位图。您的自定义视图已经有一个画布和一个附加到它的底层位图。您可以使用画布通过View.onDraw(Canvas canvas)

简单地绘制到该位图
  

问题2:如何避免和处理内存不足问题?

当您添加越来越多的位图时,系统会不断分配内存,并且在某个时刻会抛出OutOfMemoryError。以下是避免这种情况的方法:

  1. 避免创建新的位图并通过View.onDraw(Canvas canvas)直接绘制到视图的画布
  2. 不要让用户创建太多位图。根据内存分配限制它们
  3. 尝试重新使用现有的位图(如果可能的话)
  4. 创建所需大小的位图而不是更多
  5. 如果颜色不是您的主要问题,请不要使用Bitmap.Config.ARGB_8888,而是尝试其他配置选项