2

我正在制作绘图应用程序,用户可以在其中绘制一些基本形状,如正方形,三角形,线条和自由绘图。在画布上绘图时出现内存不足问题

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

添加了几个形状后,应用程序崩溃。根据我的观察,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

+0

请张贴您的堆栈跟踪以及 – Neil

+0

请通过[与此链接](http://stackoverflow.com/a/10127787/8012913)并找到有效的答案。 –

+0

设置canvas.drawBitmap(canvasBitmap,0,0,canvasPaint)的原因是什么?没有绘制位图,我不能在画布上绘制? –

回答

0

嗨尝试致电bitmaprecycle()方法,你绘制完之后,这对我帮助很大,使用recycle()方法,

释放与此位关联的原生对象,并清除 参考像素数据。这不会同步释放像素数据 ;它只是允许它被垃圾收集,如果有 没有其他引用..

请考虑阅读这个官方文件建立here

0

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

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

问题2:如何避免和照顾内存不足问题?

随着您添加越来越多的位图,系统会不断分配内存,并在某个点会抛出OutOfMemoryError。以下是如何避免这种情况:

  1. 避免产生新的位图,并通过View.onDraw(Canvas canvas)
  2. 直接绘制到视图的画布不要让用户创建了太多的位图。限制它们基于内存分配
  3. 尝试重新使用现有的位图,如果有可能
  4. 创建大小的位图,你需要和不
  5. 如果颜色是不是你的主要关注点不使用Bitmap.Config.ARGB_8888而是尝试其他配置选项