android - 在 Canvas 上绘图时出现内存不足问题

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

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

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

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

问题一:在canvas上绘制是否需要每次都生成位图?

问题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);
}

`

我在许多绘图示例中看到过,它们正在创建位图实例并将其绘制在 Canvas 上。为什么需要它?

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

最佳答案

Quesion 1: Is it required to generate bitmap each time to draw on canvas?

如果不需要关心位图,只想把图展示给用户看,那就没必要每次都生成位图。您的自定义 View 已经有一个 Canvas 和一个附加到它的底层位图。您可以通过 View.onDraw(Canvas canvas)

使用 Canvas 简单地绘制到该位图

Question 2: How to avoid and take care of out of memory issue?

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

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

关于android - 在 Canvas 上绘图时出现内存不足问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43979488/

相关文章:

android - AndEngine中的手绘物理对象

ios - 在图像上绘制以标记特定对象并保存到照片库

c# - 牛顿分形的 1/4 只画出来了

java - 打开跟踪文件时出错:没有这样的文件或目录| java.lang.ClassNotFoundException:net.sourceforge.jtds.jdbc.Driver

.net - 绘制立方体时出现 OutOfMemory 异常

android - Crashlytics 崩溃了

java - 尝试设置数组元素时出现 "java.lang.OutOfMemoryError: Java heap space"

scala - Scala 中的范围和内存问题

java - handler.postDelayed 无法正常工作

Android MVP - 如何使用依赖于 Android 类的逻辑?