【问题标题】:How to tile and scroll a large image (10000x10000) in android如何在android中平铺和滚动大图像(10000x10000)
【发布时间】:2011-01-13 09:09:25
【问题描述】:

我在 android 的一个地图项目中工作。它包含 10000x10000 分辨率的较大图像。将此图像与Bitmap 一起使用会得到OutOfMemoryError。所以我想平铺和滚动这张图片。当我滚动图像时,只有可见的屏幕必须有图块,其他不可见的图块必须回收。我花了很多时间,但没有找到任何东西。

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

【问题讨论】:

  • 您是否正在寻找一些可以做到这一点的开源程序?或者你只是对算法感兴趣?
  • 你好,格雷格,任何一个都适合我。
  • @ankitagahoi :我现在面临和你一样的问题。我使用自定义视图和 Ract 进行绘制。但我无法在设备上看到图像。我可以在蓝色堆栈上看到完整的图像和画布,但是当我安装在设备中时它不会工作。我可以知道它在设备中是如何工作的吗

标签: android


【解决方案1】:

根据 Dave 的建议,您可以将图像分成 1600 个部分,每个部分 250x250 像素。 Photoshop 在不到一分钟的时间内轻松完成此操作 (here)。您也不必担心自己编写 html。一旦你有了 html(我们称之为 bigimage.html)和 images 文件夹,将它们放在你的 assets 文件夹中并以这种方式访问​​它们 -

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我认识的人遇到了同样的问题。他们通过首先将图像分割成方形图块来解决这个问题。然后他们生成一个 HTML 页面,以 <table> 布局显示图像,并让内置浏览器显示结果页面。这意味着浏览器管理图像的可见性,并为您提供双向滚动和捏合缩放功能。

      这种方法非常容易编码,但失去了编写您自己的自定义解决方案的灵活性。这是针对较小的图像(2000x1500 ish),所以我不确定它如何缩放到您需要的尺寸。

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

      【讨论】:

      • hello dave.c 实际上这是离线应用程序,我不能使用浏览器。所以请提供另一个解决方案。
      • 此解决方案可离线工作,因为您的应用程序会在手机中动态创建 HTML,然后让浏览器显示它。无需网络访问。您可能还可以生成 HTML 并使用 WebView 来显示它。
      • 请告诉我们您的进展情况
      • 有没有办法使用这种方法为谷歌地图项目创建Overlay?我自己尝试用BitmapRegionDecoder 平铺它,但图像似乎已损坏。这种方法让我很感兴趣,但我不确定是否可以使用 HTML 为MapView 创建一个透明的Overlay
      • 有什么理由需要<table>?多个<div> 也可以吗?
      【解决方案4】:

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

      您可以继承View,并在成员变量中保持当前距中心[0,0]的偏移量。

      onDraw(Canvas) 中,您应该根据当前偏移量绘制可见的图块(由于您知道当前的平移偏移量、每个图块的大小和屏幕的大小,因此很容易计算出应该可见的图块。只需绘制将Bitmaps 平铺到Canvas

      然后在您的活动中处理onTouchEvent。您可以处理MotionEvent.ACTION_MOVE,您只能在当前可见的图块中移动,然后在MotionEvent.ACTION_UP 上,您将进行真正的重绘并调用线程来获取新图块(因此您不会进行昂贵的操作在每个手指运动上)。使用 View 的 invalidate() 方法强制它在平移后重新绘制。

      【讨论】:

      • 你好 Axarydax 感谢你的快速回复。实际上我是 android 新手,你能提供我的示例代码吗..
      猜你喜欢
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多