我在android中的地图项目中工作。它包含10000x10000分辨率的更大图像。将此图片与Bitmap
一起使用,即可获得OutOfMemoryError
。所以我想平铺并滚动这个图像。当我滚动图像时,只有可见屏幕必须有瓷砖,其他隐形瓷砖必须回收。我花了很多时间但没找到任何东西。
任何帮助将不胜感激。 为我提供更好的解决方案或想法。
答案 0 :(得分:5)
根据Dave的建议,您可以将图像分成1600个250x250px的部分。 Photoshop可在不到一分钟的时间内轻松完成此任务(here)。您也不必担心自己编写html。一旦你有html(让我们称之为bigimage.html)和images文件夹,将它们放在你的资源文件夹中并以这种方式访问它们 -
setContentView(webView);
try {
webView.loadUrl("file:///android_asset/bigimage.html";
webView.getSettings().setLoadsImagesAutomatically(true);
} catch (Exception e) {
e.printStackTrace();
}
答案 1 :(得分:5)
从API级别10开始,您可以使用BitmapRegionDecoder
从图像加载特定区域,而无需手动生成切片图像。我最近开发了一个lib,它通过触摸手势处理提供大图像的可视化。源代码和示例可在https://github.com/diegocarloslima/ByakuGallery
答案 2 :(得分:4)
我认识的人遇到了同样的问题。他们通过首先将图像分割成方形瓷砖来解决它。然后,他们生成一个HTML页面,以<table>
布局显示图像,并获取内置浏览器以显示结果页面。这意味着浏览器管理图像的可见性,它为您提供双向滚动和双指缩放。
这种方法很容易编码,但却失去了编写自己的自定义解决方案的灵活性。这是为了一个较小的图像(2000x1500 ish),所以我不确定它将如何扩展到你需要的尺寸。
如果你选择这条路线,请确保你的桌子上有border="0" cellpadding="0" cellspacing="0"
,图片上有border="0"
,以确保连接无缝。
答案 3 :(得分:0)
您可以将图像平铺为方形图块(例如256x256像素)。
您可以创建View
的子类,并在成员变量中保持当前偏移距离[0,0]。
在onDraw(Canvas)
中,您应该根据当前偏移量绘制可见的图块(当您知道当前平移偏移量,每个图块的大小和屏幕大小时,可以很容易地计算出哪些应该是可见的。将图块Bitmaps
绘制到Canvas
。
然后在您的活动中处理onTouchEvent
。您可以处理MotionEvent.ACTION_MOVE
只能在当前可见的图块上移动,然后在MotionEvent.ACTION_UP
上进行真正的重绘并调用线程来获取新图块(所以你不会在每个手指运动上做一个昂贵的操作)。在平移后使用View的invalidate()
方法强制重绘。