close
当前位置: 物联网在线 > 技术文库 > android >

Android动态壁纸解析(2)

在我们的壁纸 Service 即 WallpaperService 中,实现 Engine 。完整代码可以看 这里 。

public class NormalWallpaperService extends WallpaperService { @Override public Engine onCreateEngine() { return new MyWallpaperEngine(); } private class MyWallpaperEngine extends Engine { private final Handler handler = new Handler(); private final Runnable drawRunner = new Runnable() { @Override public void run() { draw(); } }; ......

最后我们在 MainActivity 中,增加按钮让用户跳转到壁纸设置页面。

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void setting(View view) { Intent intent = new Intent( WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, new ComponentName(this, NormalWallpaperService.class)); startActivity(intent); } public void customSetting(View view) { startActivity(new Intent(this, SettingActivity.class)); } }

这样,我们的第一个壁纸应用创建好了。每秒钟会随机画一个圆。并且支持自定义设置,可以设置圆的最大数量、是否支持触摸事件。

运行之后的效果图:

Android动态壁纸解析

GLWallpaperService

GL就是OpenGL,它是一个高性能的二维和三维的图形绘制库。这里我不再详细的介绍,有兴趣的同学可以戳 这里 。

GLWallpaperService是早年(Android 2.2时期,为什么不是2.1?因为2.2开始支持OpenGL2.0)一位美国同学开发的,这位同学自发布了这一款开源项目之后在开源界就默默无闻了。当然,你不要觉得代码太老,没人维护。可是它就是那么的好用,而且没有问题。市面上的动态壁纸使用它的数不胜数。

为什么GLWallpaperService

知道什么是OpenGL,那么原因就很明了了。高性能、高性能、还是高性能。动态壁纸在主屏幕可见的时候就一直在绘制,那么用OpenGL是最适合不过了。

让我们开始吧

开始之前,需要我们重复上面创建动态壁纸的几个基本步骤。这里直接省略,同学们自己创建。

接下来重要的,当然是把代码拿过来。代码也是简单,就一个类,直接放到项目里就行了。 还是在这里 。可以看到代码的第一行写着 2008年 ,你没有看错。

现在我们需要实现里面的两个主要的类, Service 类和 GLSurfaceView.Renderer 类。这里的 Service 需要继承 GLWallpaperService ,它的行为和Android的 WallpaperService 类似,都是需要实现 onCreateEngine() 这个方法。但是为了使用OpenGL,我们需要返回一个 GLEngine 对象。 GLEngine 里面有一个 GLThread 对象,渲染操作都会在 GLThread 中执行,从而保证了高效。

还是上代码

我们还是由一个简单的demo开始,篇幅原因,我就用最简单的demo。

创建 MyRenderer 继承自 GLSurfaceView.Renderer 。逻辑很简单,就是用OpenGL画个背景。

public class MyRenderer implements GLSurfaceView.Renderer { public void onDrawFrame(GL10 gl) { // Your rendering code goes here gl.glClearColor(0.2f, 0.4f, 0.2f, 1f); gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); } public void onSurfaceChanged(GL10 gl, int width, int height) { } public void onSurfaceCreated(GL10 gl, EGLConfig config) { } /** * Called when the engine is destroyed. Do any necessary clean up because * at this point your renderer instance is now done for. */ public void release() { } }

创建 MyGLWallpaperService 继承自 GLWallpaperService 。

public class MyGLWallpaperService extends GLWallpaperService { @Override public Engine onCreateEngine() { MyEngine engine = new MyEngine(); return engine; } private class MyEngine extends GLEngine { MyRenderer renderer; public MyEngine() { super(); // handle prefs, other initialization renderer = new MyRenderer(); setRenderer(renderer); setRenderMode(RENDERMODE_CONTINUOUSLY); } public void onDestroy() { super.onDestroy(); if (renderer != null) { renderer.release(); } renderer = null; } } }

demo创建好了,运行之前需要确保前面的基本配置都做好了。

接下来,我们着手实现最前面的效果。


(责任编辑:ioter)

用户喜欢...

Android Weekly #276 安卓开发周刊 中文版

您是否了解过Android的Lifecycle-Aware库?(android.jlelse.eu) 我们如何了解Lifecycle-Aware库代码? Nishant Srivastava展示了可以跟踪活动或Lifecycle-Aware的Lifecycle Arch组件的片段,并相应地调整其行为。 为Mos...


Android Weekly #275 安卓开发周刊 中文版

MapMe — Android地图适配器 (medium.com) Josh Burton介绍MapMe,是一个用Kotlin编写的Android库,可以将适配器模式带到地图上。 赞助 CloudRail - 连接到API 10x更快 (cloudrail.com) 当我们用单一的界面连接到所...


使用Android Studio开发可独立运行(runnable)混淆过的Jar程序

之前开发Java程序一直都是使用Eclipse 开发Jar程序,现在开发基本上都已经弃用Eclipse了,但是有时偶尔开发个小的Jar程序,还要切换回去好麻烦,刚好前几天有人问几个相关的问题,就顺便整...


Android Weekly #274 安卓开发周刊 中文版

探索Android Oreo上的别后执行限制(medium.com) 在这篇文章中,Joe Birch解释了关于Android Oreo在后台运行服务的变化。 non-Time领主的time – 第5部分 (blog.stylingandroid.com) Mark Allison继续分析JSR 310 date和...


Android Weekly #273 安卓开发周刊 中文版

开源你的Android代码(android.jlelse.eu) 通过您的开源Android代码,您将(希望地)为Android社区提供有价值的代码,收到建设性的反馈,并与您最初建立的内容进行协作从而使您的代码变得更好。这...


Android Weekly #272 安卓开发周刊 中文版

Android Dev 101:每个初学者都应该知道的一些做法() 看一些初学者或媒介等级开发人员(不要错过任何人)应该知道的一些做法,以便更好地摆脱Android框架。 99.9% crash free sessions (medium.com) Chr...


Android Weekly #271 安卓开发周刊 中文版

依赖注入检查(medium.com) 在本文中,MihályNagy引入了依赖注入检查,一种开源注释处理器,可帮助您解决一些出现在所有JSR 330 DI库中常见的问题。 使用Android Studio插件提高效率 (blog.mindorks.com...


Android Weekly #270 安卓开发周刊 中文版

带有RxJava2的SOLID Android分析 (medium.com) 在这篇文章中,Aris Papadopoulos将解释如何正确创建一个分析系统,同时遵循SOLID原则,并使用RxJava2来解决问题。 (blog.stylingandroid.com) Java中的编程时间很难...


Android内存泄漏思考

Android内存泄漏是一个经常要遇到的问题,程序在内存泄漏的时候很容易导致OOM的发生。那么如何查找内存泄漏和避免内存泄漏就是需要知晓的一个问题,首先我们需要知道一些基础知识。...


Android Weekly #269 安卓开发周刊 中文版

在Google上快速提出操作 () Wolfram Rittmeyer分享了开始在Google上快速创建操作所需的所有信息(为了家庭与助理)。 RxJava中的错误处理(rongi.github.io) 一旦开始编写RxJava代码,你就会意识到有些事...