我正在使用SurfaceView在Android应用程序中显示大图像(通常比屏幕更大,但并不总是)。 这是非常简单的graphics,使用OnTouchListener或GestureDetector实现滚动很容易。 graphics在Render循环中运行,但是对于所有真实的设备来说,性能似乎已经足够了(尽pipe仿真器可能有点痛苦)。
我正在考虑在图像上实施捏和缩放,但是我宁愿避免去OpenGL,因为我对OpenGL的经验很less,使用OpenGL看起来好像太简单了。
看起来好像android.graphics.Camera类可能允许我实现我想要的缩放function。
有谁知道任何一个很好的例子,显示在一个基本的Android SurfaceView的捏function缩放像function的实现?
另外,如果你已经实现了这样的东西,对性能有什么想法? 鉴于这里所要求的是如此简单,OpenGL值得额外的麻烦吗?
这个问题在这里还不清楚,还是我在Android开发人员网站上丢失了一些非常明显的文档/代码,我应该find?
好的 – 终于有时间真正的工作和研究了一段时间了,我实际上find了一个解决scheme来解决我所遇到的问题。
该解决scheme依赖于BitmapRegionDecoder(API10 +)。 这样做是允许应用程序加载位图的一部分,而不是试图一次加载整个位图。
解决scheme的本质:
整个位图的下采样版本保存在内存中。 由于这个版本是下采样,它可以永久保存在那里。
一个线程将当前视口(或更多)的位图连续加载到内存(使用BitmapRegionDecoder)。 由于这个尺寸至多比屏幕稍微大一点,所以这也应该适合在记忆中。
渲染线程将适当的版本绘制到canvas上; 即如果缩小或位图不可用(例如,因为它在后台加载),则使用下采样版本。
Pan,Fling和Zoom使用GestureListeners进行处理。
值得一提的是John Lombardo首次实现了我发现的想法。
这是一个相当新的实现,所以目前还没有真正的用户的火的洗礼。 但是,我已经运行了显示8000×4000像素位图的testing,目前没有问题。 性能当然似乎足以满足我的需求。
使用缩放和缩放实现ScaleGestureDetector和Canvas接口与变换matrix的组合。 您将要使用相同的转换matrix来处理缩放和翻译。