动态墙纸

动态墙纸的是一个比较特殊的APK。

Android动态墙纸的本质是一个“Service”,这个Service通过AndroidManifest.xml文件中Service的intent-filter的action能够被主界面Launcher加载。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.fenghuo.wallpaper.sakura"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="7" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >

<service android:name="net.fenghuo.wallpaper.sakura.WallpaperService" 
android:label="@string/app_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>
<activity android:name="WallpaperSettingsActivity" android:label="设置" android:exported="true"/>
</application>

</manifest>

Launcher和动态墙纸的进程可以通过框架里的WallpaperManager进行进程间通信罢了,用户在Launcher桌面滑动、点击屏幕时有的动态墙纸能产生交互效果。

下面给大家大概的步骤创建一个的Live Wallpaper。

1. 首先我使用Eclipse创建一个标准的Android工程无需创建Acitivity。

2. 加入动态壁纸的设置界面,我们在/res/文件夹中新建一个名为xml的文件夹,新建一个utf8编码的xml文件,名为wallpaper.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android" 
android:thumbnail="@drawable/icon" android:description="@string/description"
android:settingsActivity="net.fenghuo.wallpaper.sakura.WallpaperSettingsActivity" />

其中thumbnail指定的是在系统动态壁纸选择列表里显示的图标,description则是文字说明.settingsActivity指定是是点击设置按钮调用的Activity


3.实现继承了WallpaerService的类了。只需要重写WallpaperServiced的onCreateEngine方法。

在这个方法里只需返回一个Engine的子类对象就可以了。所以写动态壁纸程序的主要工作量就是实现Engine的子类。

该类的作用就是让你去实现动态壁纸的具体代码。一般要重写的方法的功能。

  public void onCreate(SurfaceHolder surfaceHolder){...}

  public void onDestroy(){...}

  public void onVisibilityChanged(boolean visible){
    if(visible){//可见
     ...
    }else{ ////不可见
     ...
    }
  }
该方法作用是当前动态壁纸可见时要画图。重写这个方法一般如以上格式所示。


  public void onSurfaceCreated(SurfaceHolder holder) {
    ...
  }
该方法是应用程序第一次创建时要调用。可在这个方法里调用父类对应方法。该方法执行完毕后系统会立即调用onSurfaceChanged方法。若在这里调用父类对应方法,那么就在onSurfaceChanged中实现主要功能。

  public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height){
   ...

  }
该方法有两个用处。1.若动态壁纸要随着横屏竖屏而切换可在这里写。2.想和用户交互的话,比如用户滑动屏幕时,点击屏幕时等。3.注意:onSurfaceCreated调用之后会立即调用该方法。

4.在manifest中注册一个service。

<service android:name="net.fenghuo.wallpaper.sakura.WallpaperService" 
android:label="@string/app_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>

  在这个servier中要指定你继承WallpaperService类的路径,指定1中设置的xml,设置广播,设置允许权限等。比如:

  通过android:name="net.fenghuo.wallpaper.sakura.WallpaperService"指定继承WallpaperService的类 ,

  通过android:permission="android.permission.BIND_WALLPAPER">允许动态壁纸权限。

  这一种还必须设置一个<intent-filter>,用来监听Android系统发出的动态壁纸的广播。

  具体信息则通过<meta-data android:name="android.service.wallpaper" android:resource="@xml/wallpaper"/> .

你可能感兴趣的:(动态墙纸)