`
zsg88
  • 浏览: 25112 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

樱花漂落的动态壁纸

阅读更多

 一个樱花飘落的动态壁的例子学习动态壁纸开发。 图片来源于樱花动态壁纸.apk,   源码见底部

 

樱花飘落1樱花漂落2樱花飘落3

 

动态墙纸的是一个比较特殊的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"/> .

 

 源代码如下。   

 

  • 大小: 19.2 KB
  • 大小: 19.8 KB
  • 大小: 23.3 KB
分享到:
评论
5 楼 flycatdeng 2013-11-13  
先添加动态壁纸,将动态壁纸设置为你的壁纸,紧接着又添加动态壁纸,还是设置为你的壁纸,那么第一次会有动画,而第二次及以后就不再有动画!这是一个bug,我看看怎么解决,希望楼主看到我所描述的问题之后也解决一下!
4 楼 spring804847326 2013-03-31  
 
3 楼 gybin 2012-12-10  
看起来挺好的。
2 楼 kenvinsnow 2012-09-03  
请问楼主怎么把这个改成普通的app啊,不用来作动态壁纸
1 楼 greenboy1 2012-05-29  
楼主 强啊 我先下载看看 若有不懂向楼主请教

相关推荐

Global site tag (gtag.js) - Google Analytics