2012-05-04 96 views
10

我正在使用SurfaceView在Android应用程序中显示大图像(通常比屏幕更大,但并非总是)。这是非常简单的图形,使用OnTouchListener或GestureDetector实现滚动很容易。图形在Render循环中运行,但是对于所有真实设备来说性能似乎已经足够了(尽管如此,模拟器可能有点痛苦)。在Android上实现捏和缩放SurfaceView

我正在考虑在图像上实施捏和缩放,但是我宁愿避免去OpenGL,因为我对OpenGL的经验很少,使用OpenGL看起来像是一件很简单的事情, 。

看起来好像android.graphics.Camera类可能允许我实现我想要的缩放功能。

有谁知道任何一个很好的例子,显示在基本的Android SurfaceView上执行捏缩放功能吗?

另外,如果你已经实现了这样的东西,对性能有什么想法?考虑到这里需要的是如此简单,OpenGL是否值得额外的麻烦?


是问题不清楚这里,还是我失去了对Android开发者网站,我应该已经发现了一些令人眼花缭乱明显文档/代码?

+0

我也在寻找这样的东西。你有没有得到解决方案。你能分享一下吗? – Nir

+0

不幸的是,没有什么,我真的很开心。当然可以使用“暴力破解”(使用GestureDetector),但这不是一个很好的解决方案,并且会非常耗费内存。 –

+0

嗯...看看这个教程:http://blahti.wordpress.com/2013/01/07/pan-zoom-examples-for-android/我还没有检查出来,但只是基于快速浏览,它看起来很有希望。 –

回答

3

好的 - 终于有时间真的在这段时间里工作和研究了一段时间,我实际上找到了一个解决方案来解决我所遇到的问题。

该解决方案依赖于BitmapRegionDecoder(API10 +)。这样做可以让应用程序加载位图的一部分,而不是一次尝试加载整个位图。

溶液的本质:

  1. 下采样的整个位图的版本被保持在存储器中。由于这个版本是下采样,它可以永久保存在那里。
  2. 线程将当前视口(或更多)的位图连续加载到内存(使用BitmapRegionDecoder)。由于这个尺寸至多比屏幕稍大,所以它也应该适合记忆。
  3. 渲染线程将相应的版本绘制到画布;即如果缩小或位图不可用(例如,因为它在后台加载),则使用下采样版本。
  4. Pan,Fling和Zoom由GestureListeners处理。

对于我发现的创意的第一个实现,我们得到John Lombardo的信任。

我在https://github.com/micabyte/android_game

开源我自己的实现我的一些其他实用工具类的沿着这是一个相当最近实施,所以它不会在这个时候有火从真实用户的洗礼。但是,我已经运行了显示8000x4000像素位图的测试,目前没有问题。性能当然似乎足以满足我的需求。

+0

IT的自由项目 – Dilip

0

实现捏合和缩放是您将ScaleGestureDetector和Canvas接口与变换矩阵结合使用的功能。您需要使用相同的转换矩阵来处理缩放和翻译。