如何在Android中平铺和滚动大图像(10000×10000)

我在Android的地图项目中工作。 它包含10000×10000分辨率的较大图像。 使用这个图像与Bitmap它给OutOfMemoryError 。 所以我想要平铺和滚动这个图像。 当我滚动图片时,只有可见的屏幕必须有瓷砖,而其他不可见的瓷砖必须被回收。 我花了很多时间,但没有find任何东西。

任何帮助将不胜感激。 提供更好的解决scheme或想法。

Solutions Collecting From Web of "如何在Android中平铺和滚动大图像(10000×10000)"

按照Dave的build议,你可以将图像分成1600×250×250像素的图像。 Photoshop在不到一分钟的时间内完成了这个任务( 这里 )。 您不必担心自己写html。 一旦你有HTML(让我们称之为bigimage.html)和图像文件夹,把这两个这些资产文件夹,并以这种方式访问​​它们 –

  setContentView(webView); try { webView.loadUrl("file:///android_asset/bigimage.html"; webView.getSettings().setLoadsImagesAutomatically(true); } catch (Exception e) { e.printStackTrace(); } 

从API级别10开始,您可以使用BitmapRegionDecoder从图像加载特定区域,而无需手动生成平铺图像。 我最近开发了一个lib,提供了触摸手势处理的大图像的可视化。 源代码和示例可以在https://github.com/diegocarloslima/ByakuGallery上find

我知道有人遇到了同样的问题。 他们首先将图像分割成方形的瓷砖,从而解决了这个问题。 然后,他们生成一个HTML页面,以<table>布局显示图像,并获取内置的浏览器来显示结果页面。 这意味着浏览器pipe理图像的可见性,它可以让你双向滚动和捏缩放。

这种方法非常容易编写,但是失去了编写自定义解决scheme的灵活性。 这是一个较小的图像(2000×1500 ISH),所以我不知道它将如何缩放到您需要的尺寸。

如果你走这条路线,确保你的桌子上有border="0" cellpadding="0" cellspacing="0" ,图像上的border="0" ,以确保连接是无缝的。

请在StackOverflow中查看以下文章 ,以获取有关解决问题的信息。

你可以把你的图片拼成正方形的图块(例如256×256像素)。

您可以inheritanceView子类,并在成员variables中保持[0,0]中心的当前偏移量。

onDraw(Canvas)您应该绘制基于当前偏移量可见的图块(因为您知道当前的平移偏移量,每个图块的大小以及屏幕的大小,因此很容易计算出哪些图块可见)。 BitmapsCanvas

然后在你的Activity中处理onTouchEvent 。 你可以处理MotionEvent.ACTION_MOVE ,你只能在当前可见的tile上移动,然后在MotionEvent.ACTION_UP做一个真正的重绘,然后调用一个线程来获取新的tile(这样你就不会执行昂贵的操作在每个手指上移动)。 使用视图的invalidate()方法强制它在平移之后重绘。