使用OpenGL ES 2.0创建Android动态壁纸?

12

有人成功地在动态壁纸中使用OpenGL ES 2.0吗?我有一个使用OpenGL ES 2.0的类,作为GLSurfaceView的渲染器可以正常运行。但是,我希望它能够作为动态壁纸的功能。我找到了Robert Green的GLWallpaperService,但它基于旧版的GLSurfaceView,并不支持setEGLContextClientVersion,这是运行OpenGL ES 2.0所需的。


5
我在 https://github.com/ghisguth/blurred-lines-live/blob/master/src/cxa/lineswallpaper/Wallpaper.java 找到了自己问题的答案。 - user382157
谢谢提供链接,我一直在寻找相同的内容 :) - kusma
@MJP:很好!请用链接回答您自己的问题。 - Macarse
请您在下面以答案的形式发布您的解决方案,这样我们就可以将其从未回答列表中移除了。谢谢。 - Bill the Lizard
2个回答

9
我已经成功地通过扩展GLSurfaceView并将其包装在壁纸服务中,使基于OpenGL的LWP运行。虽然我没有专门测试过这种方法是否支持OpenGL ES 2.0,但我认为没有理由不能支持。
您可以在 https://github.com/JesusFreke/Penroser/tree/master/src/org/jf/GLWallpaper 找到特定于LWP的文件。它们应该是通用的,并且可以直接在其他项目中使用。有关如何使用这些类的示例,请参见https://github.com/JesusFreke/Penroser/blob/master/src/org/jf/Penroser/PenroserLiveWallpaper.java

在阅读了一段时间的GLSurfaceView源代码后,我得出了一个相似的实现/想法,以获取WallpaperService的OpenGL支持。但是我评论你的答案的原因是,我认为你在GLWallpaper实现中失去了GLThread。它只会被杀死一次GLSurfaceView.onDetachedFromWindow()调用(或者在这种情况下您可以手动调用它),onSurfaceDestroyed()只将其置于等待状态。 - harism
@harism - 你是怎么不同地实现它的呢? 我已经使用JesusFreke的壁纸服务一段时间了,它运行得非常好。唯一的问题是当从预览模式应用壁纸时,GLThread有时会抛出异常,但我无法弄清楚如何解决它。 - Daniel Schuler
1
@Daniel Schuler 唯一的区别是我在 GLSurfaceView 中实现了一个 onDestroy() 方法,它被简单地写成 void onDestroy() { super.onDetachedFromWindow() }。调用此方法将会终止底层的 GL 线程,否则它将保持空闲状态并在后台运行。虽然无法确定它是否与你所遇到的问题有任何关系。 - harism

1

这篇博客文章中的代码将Robert Green的GLWallpaperService适配为能够使用OpenGL ES 2.0。你可能会取得一些成功,但使用JesusFreke的实现可能更简单。

如果您成功改进GLWallpaperService,请将更改提交回项目,以便我们所有人都受益。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接