gpt4 book ai didi

android - 在 Android SurfaceView 上实现捏合和缩放

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:12:12 24 4
gpt4 key购买 nike

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

我也在考虑在图像上实现捏合和缩放,但我宁愿避免使用 OpenGL,因为我对 OpenGL 的经验很少,而且使用 OpenGL 似乎对这种简单的事情来说太过分了。

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

有谁知道在基本的 Android SurfaceView 上实现双指缩放功能的好例子吗?

此外,如果您已经实现了类似的功能,对性能有什么想法吗? OpenGL 是否值得额外的麻烦,因为这里的要求是如此简单?


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

最佳答案

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

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

解决方案的本质:

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

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

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

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

关于android - 在 Android SurfaceView 上实现捏合和缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10445664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com