LiveWallPaper 动态壁纸是从Android2.1就开始带有的一个新的特性。它让我们能够将本来毫无生气的静态的手机屏幕背景替换成 从 随着音乐的活力和脉动而跳跃的声线 到 手指抚过能激起阵阵涟漪的静默的池塘。显示当前天气情况、展示幻灯片甚至是表现烟火特效也只是android百变动态壁纸的冰山一角。现在让我们揭开它神秘的面纱。看看这些神奇的应用是如何做到的。
实现步骤:
1、为新项目中的androidmanifest.xml文件中添加新的属性
<application android:label="@string/app_name">
<service android:name=".Wallpaper" android:label="@string/service_name"
android:permission="android.permission.BIND_WALLPAPER">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data android:name="android.service.wallpaper" android:resource="@xml/wallpaper" />
</service>
</application>
注释:<service> 定义了一个将运行在背景上并且对事件有响应的Android服务。android:permission="android.permission.BIND_WALLPAPER" 意思是任何程序调用我们的服务都需要有一个指定的权限。 < intent-filter >这个标签告诉Android它是个什么样的服务。< meta-data>标签让它知道在哪能找到关于wallpaper的额外信息。android:resource被设为"@xml/wallpaper"(名字任意,但得对应上),这个值最好设置在res/xml/wallpaper.xml文件。以下便是该xml文件的内容:
<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
android:author="@+string/author"
android:description="@string/description"
android:thumbnail="@drawable/thumbnail" />
需要在string.xml文件创建相应的注解。
2、主界面里实现Wallpaper.livepicker
Intent intent = intent.setClassName("com.android.wallpaper.livepicker","com.android.wallpaper.livepicker.LiveWallpaperListActivity");
startActivity(intent);
3、实现Service类,控制动态壁纸的内容显示。其实动态壁纸就是一个Service服务,在后台不断运行渲染,来实现桌面内容的变化(这样是为什么动态壁纸会很耗电的原因)。LiveWallpaper将由Service的子类WallpaperService 来处理。关键点是要实现Engine类。
/* Wallpaper.java */
public class Wallpaper extends WallpaperService {
@Override
public Engine onCreateEngine() {
return new MyEngine();
}
private class MyEngine extends Engine {
// 从这里实现引擎。。。
}
}
4、实现Engine类,构建绘图引擎。 因为这个MyEngine一定要是Wallpaper里的一个类,所以在类的封闭的大括号中声明了它。MyEngine 扩展了由Android提供的Engine类。以下的代码是带有所有要用到的方法的MyEngine 纲要。
/* Wallpaper.java */
private class MyEngine extends Engine {
@Override
public void onCreate(final SurfaceHolder holder) {
super.onCreate(holder);
}
@Override
public void onDestroy() {
super.onDestroy();
};
@Override
public void onSurfaceCreated(final SurfaceHolder holder) {
super.onSurfaceCreated(holder);
}
@Override
public void onSurfaceDestroyed(final SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
}
@Override
public void onSurfaceChanged(final SurfaceHolder holder,
final int format, final int width, final int height) {
super.onSurfaceChanged(holder, format, width, height);
}
@Override
public void onVisibilityChanged(final boolean visible) {
super.onVisibilityChanged(visible);
}
@Override
public void onOffsetsChanged(final float xOffset,final float yOffset, final float xOffsetStep,final float yOffsetStep, final int xPixelOffset,final int yPixelOffset) {
super.onOffsetsChanged(xOffset, yOffset, xOffsetStep,yOffsetStep, xPixelOffset, yPixelOffset);
}
}
在Engine的整个生命周期中,Android会在特定的命令下调用这些方法。下面就是整个句子。
onCreate
onSurfaceCreated
onSurfaceChanged (1+ calls in any order)
onOffsetsChanged (0+ calls in any order)
onVisibilityChanged (0+ calls in any order)
onSurfaceDestroyed
onDestroy
5、注意事项:
1)不要用Thread,应直接使用Handler与Runnable接口对象组合运行。使用Thread会产生一些莫名其妙的问题,比如:壁纸预览时报错;壁纸设置时报错;壁纸设置后闪一下即消失变为默认静态壁纸;壁纸设置后停止运行但切换到待机状态再切回还是能运行的。
2)最好指定uses-feature标记在AndroidManifest.xml中指定如下代码会使程序在市场中对不支持动态壁纸功能的用户隐藏:
<uses-feature android:name="android.software.live_wallpaper" />
3)设置接收onTouchEvent事件时要指定setTouchEventsEnable(true),默认情况是不接收该事件的。
参考链接:http://www.apkbus.com/forum.php?mod=viewthread&tid=18755
代码示例下载链接:http://www.apkbus.com/forum.php?mod=viewthread&tid=131152