2014-11-24 66 views
1

我已知的问题是,我的位图/画布太大,它会引发java.lang.OutOfMemoryError。 我的问题是什么对我的需求最好。 画布应绘制一个图形(给定点),可以非常宽(如3000像素或更多,理论上它可以更宽,像20000px)。高度已修复。 因为这对于任何屏幕都很宽,所以我把它放在滚动视图中,并将整个图形绘制到画布上。 所以这就是宽位图,我得到的错误。 第二种可能性是修复大小的画布,我会写一个“onScroll”方法,根据用户的滑动刷新图形。所以它只会画出一部分图。 这是更好的方法,还是有办法使第一个选项工作? 无论如何,请给我一些提示和解决方案的示例代码。滚动视图中的大画布/位图或滚动画布上的重绘画布?什么方式更快,也避免java.lang.OutOfMemoryError

下面是代码:

Bitmap bitmap = Bitmap.createBitmap(speedCanvasWidth,speedCanvasHeight,Bitmap.Config.RGB_565); //I also tried ARGB_8888 
speedCanvas = new Canvas(bitmap); 
graph.setImageBitmap(bitmap); 

在此先感谢

回答

1

您可以用BitmapRegionDecoder处理这个问题。只需创建一个指向图像的实例即可。系统将在图像上保留一个句柄,然后您可以在解码器上调用decode,这取决于您想在画布内显示哪个矩形。对画布的更新必须根据您的需求进行处理。这将有助于防止加载您必须处理的大图像。

通过检查位图信息,您可以进一步了解有关位图的详细信息。这可以通过将BitmapFactory.Options标志设置为对于inJustDecodeBounds为真加载位图到内存中来完成。这样可以避免在检查过程中实际将Bitmap加载到内存中。

例如,快速检索,可以用下面的做:

BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance("pathToFile", true); 
Bitmap regionOfInterestBitmap = decoder.decodeRegion(rectWithinImage, null);//Or with options you have decided to load. 
+0

的问题是,我没有图像。我在画布上绘制了一个“实况”图。因此,通过这个解决方案,我必须创建画布(非常广泛),在画布上绘制整个图形,然后使用您的解决方案将画布的一部分加载到位图中?如果是这样,这将是一个好主意。一些简短的提示如何做到这一点? – 2014-11-24 20:38:19

+0

@Hömafreak哦。这有点不同。我试图描述的解决方案的整个目标是防止根据您已经控制的图像将不必要的像素加载到内存中。如果您一次将所有内容加载到画布上,则会用尽内存,并以您想要的尺寸创建它们。移动系统上没有足够的可用内存来一次加载超大图像。 – 2014-11-24 20:45:13

+0

好的,我也考虑过这个问题。那么更好的解决方案是我提到的第二种可能性? – 2014-11-24 20:48:14