java - ScrollView 中的大 Canvas /位图或滚动时重绘 Canvas ?什么方法更快,也避免了 java.lang.OutOfMemoryError

标签 java android canvas bitmap out-of-memory

我有一个已知问题,即我的位图/ 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/

相关文章:

java - hibernate-commons-annotations-4.0.1.Final.jar;无效的 LOC header (错误的签名)?

java - setDisplayHomeAsUpEnabled()错误: non-static method cannot be referenced from a static context

JavaFX Canvas - 绘制后如何重新绘制 Canvas ?

android - 感叹号错误?

php - 使用 canvas.todataurl() 限制 jQuery 帖子大小

javascript - 当源是 IE/EDGE 上的加密 token 视频时,Canvas 无法从 azure 媒体播放器绘制图像

java - 对于 i 的什么值,while (i == i + 1) {} 永远循环?

java - 使用 Geotools - JAVA 重命名另存为 TableName 的形状文件

android - SurfaceView绘制性能

android - 使用 mkcert 证书进行 PWA 的本地测试