LiveWallPaper 动态壁纸是从Android2.1就开始带有的一个新的特性。它让我们能够将本来毫无生气的静态的手机屏幕背景替换成 从 随着音乐的活力和脉动而跳跃的声线 到 手指抚过能激起阵阵涟漪的静默的池塘。显示当前天气情况、展示幻灯片甚至是表现烟火特效也只是android百变动态壁纸的冰山一角。现在让我们揭开它神秘的面纱。看看这些神奇的应用是如何做到的。

实现步骤:
1、为新项目中的androidmanifest.xml文件中添加新的属性
<application android:label="@string/app_name">
          <service android:name=".Wallpaper" android:label="@string/service_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>
</application>
注释:<service> 定义了一个将运行在背景上并且对事件有响应的Android服务。android:permission="android.permission.BIND_WALLPAPER" 意思是任何程序调用我们的服务都需要有一个指定的权限。 < intent-filter >这个标签告诉Android它是个什么样的服务。< meta-data>标签让它知道在哪能找到关于wallpaper的额外信息。android:resource被设为"@xml/wallpaper"(名字任意,但得对应上),这个值最好设置在res/xml/wallpaper.xml文件。以下便是该xml文件的内容:
<?xml  version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
android:author="@+string/author"
android:description="@string/description"
android:thumbnail="@drawable/thumbnail" />
需要在string.xml文件创建相应的注解。

2、主界面里实现Wallpaper.livepicker
Intent intent = intent.setClassName("com.android.wallpaper.livepicker","com.android.wallpaper.livepicker.LiveWallpaperListActivity");
startActivity(intent);

3、实现Service类,控制动态壁纸的内容显示。其实动态壁纸就是一个Service服务,在后台不断运行渲染,来实现桌面内容的变化(这样是为什么动态壁纸会很耗电的原因)。LiveWallpaper将由Service的子类WallpaperService 来处理。关键点是要实现Engine类。
/* Wallpaper.java */
public  class  Wallpaper  extends  WallpaperService  {
   @Override
   public  Engine  onCreateEngine()  {   
    return  new  MyEngine();
   }
   private  class  MyEngine  extends  Engine  {
     //  从这里实现引擎。。。
   } 
}

4、实现Engine类,构建绘图引擎。  因为这个MyEngine一定要是Wallpaper里的一个类,所以在类的封闭的大括号中声明了它。MyEngine 扩展了由Android提供的Engine类。以下的代码是带有所有要用到的方法的MyEngine 纲要。
/* Wallpaper.java */
private  class  MyEngine  extends  Engine  {
    @Override
    public  void  onCreate(final  SurfaceHolder  holder)  {
        super.onCreate(holder);
    }
    @Override
    public  void  onDestroy()  {
        super.onDestroy();
    };
    @Override
    public  void  onSurfaceCreated(final  SurfaceHolder  holder)  {
        super.onSurfaceCreated(holder);
    }
    @Override
    public  void  onSurfaceDestroyed(final  SurfaceHolder  holder)  {
        super.onSurfaceDestroyed(holder);
    }
    @Override
    public  void  onSurfaceChanged(final  SurfaceHolder  holder,
        final  int  format,  final  int  width,  final  int  height)  {
        super.onSurfaceChanged(holder,  format,  width,  height);
    }
    @Override
    public  void  onVisibilityChanged(final  boolean  visible)  {
        super.onVisibilityChanged(visible);
    }
    @Override
    public  void  onOffsetsChanged(final  float  xOffset,final  float  yOffset,  final  float  xOffsetStep,final  float  yOffsetStep,  final  int  xPixelOffset,final  int  yPixelOffset)  {
        super.onOffsetsChanged(xOffset,  yOffset, xOffsetStep,yOffsetStep,  xPixelOffset,  yPixelOffset);
    }
}

在Engine的整个生命周期中,Android会在特定的命令下调用这些方法。下面就是整个句子。
onCreate
     onSurfaceCreated
                  onSurfaceChanged (1+ calls in any order)
                  onOffsetsChanged (0+ calls in any order)
                  onVisibilityChanged (0+ calls in any order)
     onSurfaceDestroyed
onDestroy

5、注意事项:
1)不要用Thread,应直接使用Handler与Runnable接口对象组合运行。使用Thread会产生一些莫名其妙的问题,比如:壁纸预览时报错;壁纸设置时报错;壁纸设置后闪一下即消失变为默认静态壁纸;壁纸设置后停止运行但切换到待机状态再切回还是能运行的。
2)最好指定uses-feature标记在AndroidManifest.xml中指定如下代码会使程序在市场中对不支持动态壁纸功能的用户隐藏:
<uses-feature android:name="android.software.live_wallpaper" />
3)设置接收onTouchEvent事件时要指定setTouchEventsEnable(true),默认情况是不接收该事件的。

参考链接:http://www.apkbus.com/forum.php?mod=viewthread&tid=18755

代码示例下载链接:http://www.apkbus.com/forum.php?mod=viewthread&tid=131152

http://download.csdn.net/detail/klcf0220/5914975

WallPaper的更多相关文章

  1. Muzei Live Wallpaper壁纸应用安卓源码项目

    这个刚刚在安卓教程网那里看到的,这个是Muzei Live Wallpaper壁纸应用源码,这是已经在Playstore上线了的android壁纸应用,点击壁纸界面可以磨砂透明效果以及一般背景效果之间 ...

  2. android设置动态壁纸 (Wallpaper) 介绍

    当进入改壁纸的设置页面 但是还没有设置时 09-21 07:55:05.575: INFO/System.out(1337): service onCreate09-21 07:55:05.614: ...

  3. Android窗口管理服务WindowManagerService对壁纸窗口(Wallpaper Window)的管理分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8550820 Android系统中,壁纸窗口和输 ...

  4. C#获取桌面壁纸图片的路径(Desktop Wallpaper)

    原文 C#获取桌面壁纸图片的路径(Desktop Wallpaper) 利用 Windows 的 API 获取桌面壁纸的实际路径,使用的是 SystemParametersInfo 这个API,此AP ...

  5. 前端福利:使用Wallpaper Engine让自己的桌面炫酷起来

    Wallpaper Engine,是一款Steam上的特别特别炫酷的壁纸定制软件.它可以对你的桌面进行定制,可以使用视频,动画,网页等形式来替换壁纸. 注意到没,关键是可以使用Html格式的文件作为桌 ...

  6. Mac电脑上一款非常时尚高清的动态壁纸Living Wallpaper HD

    很多朋友Mac电脑上都喜欢用动态壁纸,Living Wallpaper HD是本人尝试的一款非常不错的高清动态壁纸.有时钟.天气等各种组建,非常时尚美观. Living Wallpaper HD下载地 ...

  7. Android launcher 壁纸 wallpaper

    壁纸分为动态和静态两种: 如果只需要修改默认静态壁纸,替换frameworks/base/core/res/res/drawable/default_wallpaper.jpg即可,或者在源码中修改对 ...

  8. Android 开机画面和wallpaper总结

    Android 开机画面和wallpaper总结  1 kernel的开机画面修改 1.图片需求:图片格式:png图片大小:1024x600(具体示lcd分辨率而定). 2.转换图片png图片. 假设 ...

  9. Processing分形之一——Wallpaper

    之前用C语言实现过一些分形,但是代码比较复杂.而对于天生对绘图友好的Processing,及其方便. 在大自然中分形普遍存在,我们用图形模拟,主要是找到一个贴近的函数. 代码 /** * Wallpa ...

随机推荐

  1. 最最最最最基础的SQL Server

    --创建数据库(命名不允许为汉字开头.不允许为数字开头.不允许为符号开头) create database Class --执行完成进行下一步点加go go --定位数据库 use Class --创 ...

  2. 洛谷P1850 换教室

    令人印象深刻的状态转移方程... f[i][j][0/1]表示前i个换j次,第i次是否申请时的期望. 注意可能有重边,自环. 转移要分类讨论,距离是上/这次成功/失败的概率乘相应的路程. 从上次的0/ ...

  3. DoubleOps.java

    /****************************************************************************** * Compilation: javac ...

  4. Service Fabric基本概念: Node, Application, Service, Partition/Replicas

    作者:张鼎松 (Dingsong Zhang) @ Microsoft 在上一节中,为大家简明扼要的介绍了微软针对现代分布式系统在Azure上实现的相关服务组件.紧接上文内容,本节将为大家介绍Azur ...

  5. 重新打开Eclipse出现“An internal error has occurred. java.lang.NullPointerException”

    如果出现了上述的错误按照如下的3个步骤解决:1.首先关闭MyEclipse工作空间.2.然后删除工作空间下的. “/.metadata/.plugins/org.eclipse.core.runtim ...

  6. Python基础【day01】:初始模块(五)

    本节内容 1.标准库 1.sys 2.os 2.第三方库 1.for mac 2.for linux Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相应的P ...

  7. Kanboard简单的可视化任务板,项目管理

    采用docker安装 简单快捷 下载 docker pull kanboard/kanboard:latest 运行 docker run -d --name kanboard -p 10080:80 ...

  8. Jquery中click事件重复执行的问题

    平常没注意事件绑定问题,在此注意一下: function testClick(obj){ $("select").off().on("click", funct ...

  9. JavaScript之form表单的序列化和json化[form.js]

    一.应用场景 form提交时,使用ajax提交. 二.效果 通过本工具,实现表单所有form的快速序列化和json化,使前端人员在ajax提交form表单的时,脱离重复性的,大劳动量的手动抽取form ...

  10. Handler使用中可能引发的内存泄漏

    https://my.oschina.net/rengwuxian/blog/181449 http://www.jianshu.com/p/cb9b4b71a820 http://blog.csdn ...