内容简介:在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等,在之后的文章里会详细介绍。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Windows Phone 8开发指南: 平台概述
- Windows Phone 8开发指南: 平台概述
- Windows Phone 8开发指南: 平台概述
- linux 内核开发指南 - 2 开发流程
- 面向Java开发人员的Flex开发指南
- NGINX 开发指南
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。