内容简介:在Android中,壁纸分为静态与动态两种。静态壁纸是一张图片,而动态壁纸则以动画为表现形式,或者可以对用户的操作作出反应。动态壁纸实际上和其他应用是类似的,自Android 2.1开始支持。Android壁纸运行在一个Android服务之中,这个服务的名字叫做WallpaperService。当用户选择了一个壁纸之后,此壁纸所对应的WallpaperService便会启动并开始进行壁纸的绘制工作。Engine是WallpaperService中的一个内部类,实现了壁纸窗口的创建以及Surface的维护工
一、概述
1.1 简介
在Android中,壁纸分为静态与动态两种。静态壁纸是一张图片,而动态壁纸则以动画为表现形式,或者可以对用户的操作作出反应。动态壁纸实际上和其他应用是类似的,自Android 2.1开始支持。Android壁纸运行在一个Android服务之中,这个服务的名字叫做WallpaperService。当用户选择了一个壁纸之后,此壁纸所对应的WallpaperService便会启动并开始进行壁纸的绘制工作。Engine是WallpaperService中的一个内部类,实现了壁纸窗口的创建以及Surface的维护工作。
1.2 示例
简单来说,动态壁纸就是一个服务,动态壁纸需要实现动态壁纸的服务WallpaperService和描绘动态壁纸的引擎WallpaperService.Engine。
| 组件类 | 说明 |
|---|---|
| WallpaperService | 实现动态壁纸的服务程序 |
| WallpaperService.Engine | 描绘动态壁纸的引擎 |
下面以视频动态壁纸为例,讲述一下具体实现流程。
(1)首先定义一个类VideoWallpaper来继承WallpaperService类并实现onCreateEngine()方法,在该方法中需要返回一个Engine实例。
public class VideoWallpaper extends WallpaperService {
@Override
public Engine onCreateEngine() {
return null;
}
}
(2)然后定义一个VideoEngine类来继承Engine类并实现onSurfaceCreated() 、onSurfaceDestroyed()和onVisibilityChanged()方法。在onSurfaceCreated()方法中初始对象资源;在onSurfaceDestroyed()中去释放和销毁资源;在onVisibilityChanged()方法中去控制视图是显示和隐藏逻辑。以视频壁纸为例:
private class VideoEngine extends Engine {
private MediaPlayer mPlayer;
@Override
public void onVisibilityChanged(boolean visible) {
if (visible) {
mPlayer.start();
} else {
mPlayer.pause();
}
}
@Override
public void onSurfaceCreated(SurfaceHolder holder) {
super.onSurfaceCreated(holder);
mPlayer = new MediaPlayer();
//不能使用setDisplay()方法
mPlayer.setSurface(holder.getSurface());
mPlayer.setDataSource(videoPath);
mPlayer.prepare();
mPlayer.start();
}
@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
if (mPlayer.isPlaying()) {
mPlayer.stop();
}
mPlayer.release();
mPlayer = null;
}
}
(3)对VideoWallPaper服务进行注册,这里在注册时写法和普通的Service相同。需要注意的是,WallPaperService需要一个"android.permission.BIND_WALLPAPER"的权限,添加一个action为"android.service.wallpaper.WallpaperService",还需要一个名为"android.service.wallpaper"的meta-data。如下:
<service
android:label="@string/app_name"
android:permission="android.permission.BIND_WALLPAPER"
android:name=".VideoWallpaper">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data android:name="android.service.wallpaper"
android:resource="@xml/livewallpaper" />
</service>
(4)上面的代码中meta-data中需要一个xml文件源,所以还需要在res的xml文件夹(没有就创建)下,创建一个名为wallpaper的xml文件。xml文件的根标签为wallpaper,有一下三个属性:
- description :动态壁纸的文字描述
- thumbnail:动态壁纸的图片描述
- settingsActivity:动态壁纸的设置界面
动态壁纸的资源来源“/res/xml/liveWallpaper.xml”
<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/wallpaper_description"
android:settingsActivity="com.example.videowallpaper.SettingsActivity"
android:thumbnail="@mipmap/ic_launcher">
</wallpaper>
SettingsActivity代码示例如下:
public class SettingsActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.setting_layout);
}
}
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="video_param"
android:title="设置">
<CheckBoxPreference
android:defaultValue="true"
android:key="loop"
android:title="是否循环播放" />
<CheckBoxPreference
android:checked="false"
android:key="volume"
android:title="是否开启声音" />
</PreferenceScreen>
(5)接下来就是启动壁纸服务了,这里不能通过context的startService()方法来启动壁纸服务,需要通过启动系统的预览界面来间接启动服务。
Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, new ComponentName(context, VideoWallPaperService.class)); context.startActivity(intent);
除了启动还需要关闭壁纸服务,可以通过WallpaperManager的clear()方法来关闭,也可以通过WallpaperService的clearWallpaper()(已经被标记过时)方法来关闭壁纸。
try {
WallpaperManager.getInstance(context).clear();
} catch(IOException e) {
e.printStackTrace();
}
其他需要注意的地方,比如可以通过WallpaperManager的getWallpaperInfo()方法来判断当前壁纸的服务是否已经在运行,从而可以通过广播或者其他通知来直接修改壁纸播放的视频,避免每次更换一个视频都需要走一次系统的预览界面。也就是在设置里面动态设置壁纸参数。
上面只是简单的示例代码,如果对视频动态壁纸感兴趣,可以参考此项目 VideoWallpaper
以上就是实现一个基本动态壁纸的流程,其实视频动态壁纸实现起来比较简单,不需要开发者自己画出复杂的界面,也没有手势交互逻辑。但是市面上的动态壁纸大多比较复杂,而且基本上是使用绘图API画出来的,包括OpenGL等,在之后的文章里会详细介绍。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Practical Django Projects, Second Edition
James Bennett / Apress / 2009 / 44.99
Build a django content management system, blog, and social networking site with James Bennett as he introduces version 1.1 of the popular Django framework. You’ll work through the development of ea......一起来看看 《Practical Django Projects, Second Edition》 这本书的介绍吧!