繁体   English   中英

在Android SurfaceView上实现捏合和缩放

[英]Implementing Pinch and Zoom on Android SurfaceView

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

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

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

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

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


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

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

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

解决方案的本质:

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM