我正在研究一种动态墙纸,该墙纸在触摸屏幕时会带有一些水波纹效果,但我有点卡住了。

创建多个图像并循环遍历以创建波纹动画会更好,还是在将位图放置在 Canvas 上之前稍微扭曲位图会更好吗?

This是通过OpenGL实现的非常好的波纹效果的视频。

我还没有使用OpenGL的经验,想知道是否仍然可以在动态壁纸上创建2D水效果?

最佳答案

我也想在Android中实现逼真的涟漪效果,因此我将分享我的经验:

作为引用实现,我采用了Neil Wallis Java算法的Sergey的Chikuyonok JavaScript端口。这是一个可以在其中尝试原始JS代码的游乐场:http://jsfiddle.net/esteewhy/5Ht3b/6/

起初,我将JS代码移植到Java只是为了意识到在我的华为U8100硬件上没有办法以超过1 fps的速度压缩。 (网上有几次类似的尝试,唯一的结论是:它们的速度很慢,这太荒谬了)。

顺便说一句,这个SO答案对于基本了解如何在Android中编写交互式图形代码非常有用:https://stackoverflow.com/a/4946893/35438。我从那里借来了fps计数器。

然后,我决定尝试使用Android NDK在纯C语言中重新实现原始算法(这是我10多年来首次遇到它!)。尽管NDK的文档有些困惑(特别是在要求和先决条件上),但它们的工作方式都很吸引人,因此我能够达到30 fps的速度-可能不会太令人印象深刻,但是仍然比Java代码有了根本性的改进。

最后,我将所有工作都放到网上了:https://github.com/esteewhy/whater,因此可以随意使用。它包含:

  • 上面提到的交互式弹跳球代码(仅供引用)。
  • 水波纹Java端口(慢如 hell !)
  • 水波纹C实现(需要NDK进行编译,需要JDK创建.h文件)。

  • (该项目不是“干净的”,即:所有二进制文件都存在,因此即使没有NDK也可以尝试“按原样”运行它。)

    关于android - 动态壁纸水波纹效果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10326039/

    10-09 13:25