我有一个已知问题,即我的位图/ Canvas 太大,它会抛出 java.lang.OutOfMemoryError。 我的问题是什么最能满足我的需求。 Canvas 应该绘制一个图形(具有给定的点)并且可以非常宽(例如 3000px 或更多,理论上它的宽度可能更大,例如 20000px)。高度是固定的。 因为这对于任何屏幕来说都太宽了,所以我将它放在 ScrollView 中并将整个图形绘制到 Canvas 中。 这对于位图来说太宽了,我得到了错误。 第二种可能性是固定大小的 Canvas ,我会在其中编写一个“onScroll”方法,根据用户的滑动重新绘制图形。所以它只会绘制图形的一部分。 那会是更好的方法还是有办法使第一个选项起作用? 无论如何,请给我一些解决方案的提示和示例代码。
代码如下:
Bitmap bitmap = Bitmap.createBitmap(speedCanvasWidth,speedCanvasHeight,Bitmap.Config.RGB_565); //I also tried ARGB_8888
speedCanvas = new Canvas(bitmap);
graph.setImageBitmap(bitmap);
提前致谢
最佳答案
您可以使用 BitmapRegionDecoder
来处理这个问题。只需创建一个指向您的图像的实例。系统将维护图像的句柄,然后您可以根据要在 Canvas 中显示的矩形在解码器上调用 decode
。必须根据您的需要处理对 Canvas 的更新。这将有助于避免加载您必须处理的大图像。
您可以通过查看Bitmap信息进一步了解相关Bitmap的详细信息。这可以通过将位图加载到内存中并将 BitmapFactory.Options
标志设置为 true for inJustDecodeBounds
来完成。这可以防止位图在检查期间实际加载到内存中。
例如,可以使用以下方法进行快速检索:
BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance("pathToFile", true);
Bitmap regionOfInterestBitmap = decoder.decodeRegion(rectWithinImage, null);//Or with options you have decided to load.
关于java - ScrollView 中的大 Canvas /位图或滚动时重绘 Canvas ?什么方法更快,也避免了 java.lang.OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27113337/