Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何创建具有大位图的画布,在其上绘制,然后缩放到屏幕大小以节省内存?_Android_Memory_Bitmap_Android Canvas_Scale - Fatal编程技术网

Android 如何创建具有大位图的画布,在其上绘制,然后缩放到屏幕大小以节省内存?

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

简单地说,由于我需要的细节,我有一个1800 x 1800像素的位图资源。我从位图创建画布,然后在上面绘制。绘图完成后,它将附着到ImageView。它在大堆设备上运行良好,但在小型设备上崩溃。位图在添加到画布时,所有设备的大小都必须相同,因为我绘制的坐标是位图上的精确位置

这是我的密码

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;