在Android SurfaceView上实现捏合和缩放

Mic*_* A. 10 graphics android 2d

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

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

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

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

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


这个问题不清楚,或者我在Android开发者网站上遗漏了一些我应该找到的令人眼花缭乱的明显文档/代码?

Mic*_* A. 3

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

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

解决方案的本质:

  1. 整个位图的下采样版本保存在内存中。由于此版本已进行下采样,因此可以永久保留在那里。
  2. 线程不断地将当前视口(或更多)的位图加载到内存中(使用 BitmapRegionDecoder)。由于它最多比屏幕稍大一些,因此它也应该适合内存。
  3. 渲染线程将合适的版本绘制到Canvas上;即,如果您正在缩小或位图不可用(例如,因为它正在后台加载),则使用下采样版本。
  4. 平移、滑动和缩放均由 GestureListener 处理。

感谢 John Lombardo 首次实现了我所发现的想法。

我在https://github.com/micabyte/android_game上开源了我自己的实现以及一些其他实用程序类

这是一个相当新的实现,因此目前还没有受到真正用户的热烈欢迎。不过,我已经运行了显示 8000x4000 像素位图的测试,到目前为止没有出现任何问题。性能似乎足以满足我的需求。