简单地说,由于我需要的细节,我有一个1800 x 1800像素的Bitmap资源。我从Bitmap创建一个画布,然后在它上画画。绘图完成后,它附加到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但尚未尝试过。它看起来很复杂,我想要完成的任务。
答案 0 :(得分:0)
BitmapFactory.Options o = new BitmapFactory.Options();
o.inMutable = true;
initialBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.VeryLargeBitmap, o);
这样做可以消除将位图复制到不可变位的需要。当你完成它(保存到文件或为新文件准备好)时,执行以下操作:
initialBitmap.recycle();
initialBitmap = null;
删除对它的任何引用(注意:可能没有必要回收,但我喜欢“以确保”)。
编辑:
特别要注意的是,创建一个Bitmap是CPU密集型的,因此最好在一个线程中对其进行解码,并在准备就绪时开始绘制。您应该从不在onDraw
或draw
方法中创建位图。