在android中我们一般设置静态壁纸,使用WallpaperManager
可以轻松达到目的,但是使用WallpaperManager
是不能够设置动态壁纸的,为此android提供了一个WallpaperService
专门用来设置动态壁纸,那么我们就用几个简单的步骤来说明一下如何简单的定义一个动态壁纸。
1.新建一个资源文件wallpaper.xml
首先在xml目录下面新建一个wallpaper.xml的资源描述文件.
<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/wallpaper_name"
android:thumbnail="@mipmap/ic_launcher_round" />
这个xml的标签必须是wallpaper
,description用于对当前壁纸的描述,可选。thumbnail用于表示当前壁纸的缩略图,一般在launcher或者设置中设置动态壁纸的时候会显示。
2.继承WallpaperService类
public class MyWallpaperService extends WallpaperService {
@Override
public Engine onCreateEngine() {
return new MyEngine();
}
private class MyEngine extends Engine {
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
}
@Override
public void onSurfaceCreated(SurfaceHolder holder) {
super.onSurfaceCreated(holder);
Canvas canvas = holder.lockCanvas();
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setStrokeWidth(10);
p.setColor(Color.BLUE);
canvas.drawLine(0, 0, 100, 100, p);
holder.unlockCanvasAndPost(canvas);
}
@Override
public void onVisibilityChanged(boolean visible) {
super.onVisibilityChanged(visible);
}
@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
}
WallpaperService这个类没有太多的接口功能供我们调用,最重要的方法是onCreateEngine
,我们必须在这个方法中返回一个壁纸的引擎,我们所有的绘制任务都需要在这个引擎中完成。返回的Engine对象是WallpaperService的一个内部类,在这个方法中有大量的回调方法用来帮助我们完成我们的绘制逻辑,最重要的方法包括onSurfaceCreated
、onVisibilityChanged
、onSurfaceDestroyed
等,这些回调方法的功能还是很好理解的,在这里我们在壁纸层的surface创建之后绘制一个直线,无须赘述。
3.声明androidmanifest.xml
WallpaperService也是一个service,所以也需要在清单文件中声明,这里声明需要注意permission和meta-data的声明,格式比较固定,所以也不用多说了。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.coolspan.livewallpaper">
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-feature android:name="android.software.live_wallpaper" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ui.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".service.LiveWallpaperService"
android:enabled="true"
android:label="@string/wallpaper_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/my_wallpaper" />
</service>
</application>
</manifest>
4.启动
一般这样就可以在launcher或者设置中启动了,这里我们使用一个Activity来启动到设置的界面
Intent localIntent = new Intent();
localIntent.setAction(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);//android.service.wallpaper.CHANGE_LIVE_WALLPAPER
localIntent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT
, new ComponentName(this.getApplicationContext().getPackageName()
, MyWallpaperService.class.getCanonicalName()));
this.startActivity(localIntent);
设置完成之后,桌面就显示了~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。