Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中平铺和滚动大图像(10000x1000)_Android - Fatal编程技术网

如何在android中平铺和滚动大图像(10000x1000)

如何在android中平铺和滚动大图像(10000x1000),android,Android,我在安卓的地图项目中工作。它包含10000x1000分辨率的较大图像。将此图像与位图一起使用会产生OutOfMemoryError。所以我想平铺和滚动这个图像。当我滚动图像时,只有可见屏幕必须有瓷砖,其他不可见的瓷砖必须回收。我花了很多时间,但什么也没找到 任何帮助都将不胜感激。 为我提供更好的解决方案或想法。您可以将图像平铺成方形平铺(例如256x256像素) 您可以子类化视图,并在成员变量中保持与中心[0,0]的当前偏移量 在onDraw(Canvas)中,您应该根据当前偏移量绘制可见的分幅

我在安卓的地图项目中工作。它包含10000x1000分辨率的较大图像。将此图像与
位图一起使用
会产生
OutOfMemoryError
。所以我想平铺和滚动这个图像。当我滚动图像时,只有可见屏幕必须有瓷砖,其他不可见的瓷砖必须回收。我花了很多时间,但什么也没找到

任何帮助都将不胜感激。
为我提供更好的解决方案或想法。

您可以将图像平铺成方形平铺(例如256x256像素)

您可以子类化
视图
,并在成员变量中保持与中心[0,0]的当前偏移量

onDraw(Canvas)
中,您应该根据当前偏移量绘制可见的分幅(由于您知道当前平移偏移量、每个分幅的大小和屏幕的大小,因此很容易计算哪些应该可见)。只需将分幅作为
位图绘制到
画布上即可


然后在活动中处理
onTouchEvent
。您可以处理
MotionEvent.ACTION\u MOVE
只在当前可见的分幅上移动,然后在
MotionEvent.ACTION\u UP
上执行真正的重新绘制并调用线程来获取新分幅(这样您就不会在每次手指移动时都执行昂贵的操作).使用视图的
invalidate()
方法,强制其在平移后重新绘制。

我认识的某个人遇到了相同的问题。他们首先将图像分割为方形平铺,然后生成一个HTML页面,以
布局显示图像,并让内置浏览器显示生成的页面。这意味着浏览器管理图像的可视性,并为您提供双向滚动和收缩缩放功能

这种方法很容易编码,但会失去编写自定义解决方案的灵活性。这是针对较小的图像(2000x1500 ish),因此我不确定它将如何扩展到您需要的尺寸


如果你这样做,确保你的桌子上有
border=“0”cellpadding=“0”cellspacing=“0”
,图像上有
border=“0”
,以确保连接是无缝的。

根据Dave的建议,你可以将图像分成1600个250x250px的部分。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开始,您可以使用
BitMapRegionCoder
从图像中加载特定区域,而无需手动生成平铺图像。我最近开发了一个库,该库通过触摸手势处理提供大图像的可视化。源代码和示例可在

上找到。您是否正在寻找一些开源程序可以这样做吗?或者你只是对算法感兴趣吗?你好,格雷格,任何一个都可以为我工作。相关问题:@ankitagahoi:我现在和你面临着同样的问题。我使用自定义视图和Ract来绘制。但是我在设备上看不到图像。我可以在蓝色堆栈上看到完整的图像和画布,但是什么n我在设备中安装它不会工作。我可以知道它在设备中如何工作吗hello Axarydax Thanx供您快速回复。事实上,我是android新手,您能否提供示例代码..hello dave.c实际上这是脱机应用程序,我无法使用浏览器。因此请提供另一个解决方案。此解决方案脱机工作,因为您的应用程序会动态创建HTML在手机中,然后让浏览器显示它。无需网络访问。您也可以生成HTML并使用
WebView
来显示它。请告诉我们您是如何使用此方法为Google Maps项目创建
覆盖图的?我自己也尝试过用
BitmapRegionD来平铺它ecoder
,但图像似乎已损坏。我对这种方法感兴趣,但我不确定是否可以使用HTML为
地图视图
创建一个透明的
覆盖层
。您需要
的任何原因?多个
也可以吗?