10

我正在使用 SurfaceView 在 Android 应用程序中显示大图像(通常比屏幕大,但并非总是如此)。这是非常简单的图形,使用 OnTouchListener 或 GestureDetector 很容易实现滚动。图形在渲染循环中运行,但性能似乎对于所有真实设备来说都绰绰有余(不过,模拟器可能有点痛苦)。

我也在考虑在图像上实现 Pinch 和 Zoom,但我宁愿避免使用 OpenGL,因为我对 OpenGL 的经验很少,而且对于这么简单的事情,使用 OpenGL 似乎有点矫枉过正。

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

有谁知道在基本的 Android SurfaceView 上实现类似捏缩放功能的任何好的示例?

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


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

4

3 回答 3

3

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

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

解决方案的本质:

  1. 整个位图的下采样版本保存在内存中。因为这个版本是下采样的,所以它可以永久保存在那里。
  2. 线程在位图的当前视口(或更多)中不断加载到内存(使用 BitmapRegionDecoder)。由于它至多比屏幕略大,因此它也应该能够舒适地存储在内存中。
  3. 渲染线程将适当的版本绘制到 Canvas;即,如果您正在缩小或位图不可用(例如,因为它在后台加载),则使用下采样版本。
  4. Pan、Fling 和 Zoom 由 GestureListeners 处理。

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

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

这是一个相当新的实现,所以它目前还没有受到真实用户的洗礼。但是,我已经运行了显示 8000x4000 像素位图的测试,到目前为止没有任何问题。性能似乎足以满足我的需求。

于 2013-02-28T00:25:05.580 回答
0

Implementing pinch and zoom is something that you would do with a combination of the ScaleGestureDetector and the Canvas interface with a transformation matrix. You'll want to make use of the same transformation matrix to handle both scale and translation.

于 2012-05-08T23:58:22.683 回答
0

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

于 2012-05-09T00:08:16.453 回答