Android 如何创建具有大位图的画布,在其上绘制,然后缩放到屏幕大小以节省内存?
简单地说,由于我需要的细节,我有一个1800 x 1800像素的位图资源。我从位图创建画布,然后在上面绘制。绘图完成后,它将附着到ImageView。它在大堆设备上运行良好,但在小型设备上崩溃。位图在添加到画布时,所有设备的大小都必须相同,因为我绘制的坐标是位图上的精确位置 这是我的密码Android 如何创建具有大位图的画布,在其上绘制,然后缩放到屏幕大小以节省内存?,android,memory,bitmap,android-canvas,scale,Android,Memory,Bitmap,Android Canvas,Scale,简单地说,由于我需要的细节,我有一个1800 x 1800像素的位图资源。我从位图创建画布,然后在上面绘制。绘图完成后,它将附着到ImageView。它在大堆设备上运行良好,但在小型设备上崩溃。位图在添加到画布时,所有设备的大小都必须相同,因为我绘制的坐标是位图上的精确位置 这是我的密码 initialBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.VeryLargeBitmap); mutableBitmap
initialBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.VeryLargeBitmap);
mutableBitmap = initialBitmap.copy(Bitmap.Config.RGB_565, true);
canvas = new Canvas(mutableBitmap);
....draw stuff here
canvas.drawLine(x, y, x2, y2, paint);
ImageView.setImageBitmap(mutableBitmap);
ImageView..setAdjustViewBounds(true);
我相信有更好的办法。我已经研究过OpenGL,但还没有尝试过。我想要完成的事情看起来很复杂
BitmapFactory.Options o = new BitmapFactory.Options();
o.inMutable = true;
initialBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.VeryLargeBitmap, o);
这样做可以消除将位图复制到不可变位图的需要。完成后(保存到文件或准备新文件),请执行以下操作:
删除对它的任何引用(注意:回收可能没有必要,但我喜欢它“确保”)
编辑:
特别要注意的是,创建位图需要大量CPU,所以最好在线程中对其进行解码,并在准备好后开始绘制。绝不能使用
onDraw
或draw
方法创建位图。谢谢。这无疑减少了堆的大小。我将在AVDM中运行更多测试,但这是一个很大的改进。当不再需要时,我已经在回收位图了。
initialBitmap.recycle();
initialBitmap = null;