在Android SurfaceView上实现捏合和缩放

时间:2012-05-04 08:52:12

标签: android graphics 2d

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

我正在考虑在图像上实现Pinch和Zoom,但是我宁愿避免使用OpenGL,因为我对OpenGL的经验很少,并且使用OpenGL对于这么简单的事情来说似乎太过分了。

似乎android.graphics.Camera类可能允许我实现我想要的缩放功能。

有没有人知道在基本的Android SurfaceView上实现类似缩放功能的任何好例子?

此外,如果你已经实现了这样的事情,对性能的任何想法? OpenGL是否值得额外麻烦,因为这里需要的是如此简单?


这里的问题不清楚,或者我在Android开发者网站上遗漏了一些我应该找到的非常明显的文档/代码?

3 个答案:

答案 0 :(得分:3)

好的 - 我终于有时间真正地工作并研究了一段时间,我实际上找到了解决问题的解决方案。

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

解决方案的本质:

  1. 整个位图的缩减采样版本保存在内存中。由于此版本已被下采样,因此可以永久保存。
  2. 线程将位图的当前视口(或更多)加载到内存中(使用BitmapRegionDecoder)。因为它最多比屏幕略大,所以它也应该适合记忆。
  3. 渲染线程将适当的版本绘制到Canvas;即,如果您缩小或位图不可用(例如,因为它在后台加载),则使用缩减采样版本。
  4. Pan,Fling和Zoom由GestureListeners处理。
  5. 为了第一次实现我发现的想法,他获得了John Lombardo的信任。

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

    开源我自己的实现以及我的其他一些实用工具类

    这是一个非常近期的实施,所以它目前没有受到真实用户的火灾洗礼。但是,我已经运行测试显示8000x4000像素位图,到目前为止没有问题。性能当然似乎足以满足我的需求。

答案 1 :(得分:0)

通过将ScaleGestureDetector和Canvas接口与转换矩阵相结合,您可以实现捏合和缩放。您将希望使用相同的转换矩阵来处理缩放和转换。

答案 2 :(得分:0)

查看索尼爱立信开发者网站上的One Finger Zoom示例。 http://developer.sonymobile.com/wp/tag/zoom/