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. Flash10 使用剪贴板得改变程序的写法了

    昨天一个客户告诉我,在她的电脑上无法复制图片的链接地址. 一开始,我以为是她操作有误,因为在我们的系统里使用的是一种“双保险”的复制方法. javascript + flash 两种方法来进行复制. ...

  2. MATLAB:图像滤波,绝对值差(filter2,imabsdiff函数)

    下面是对图像进行滤波,以及求滤波后的图像与原图像的绝对值差的实现过程,涉及到的函数有filter2,imabsdiff函数: close all; %关闭当前所有图形窗口,清空工作空间变量,清除工作空 ...

  3. Apache HTTP Server应用的几个场景

    Apache HTTP Server应用的几个场景 前言 尽管Apache具有重量级.耗资源.低性能(相比其它的WebServer)的特点,但是同时它也具有兼容性强.稳定性高.模块丰富等特点,且处理动 ...

  4. 教你如何用Meterpreter渗透Win系统

    在这篇文章中,我们将跟大家介绍如何使用Meterpreter来收集目标Windows系统中的信息,获取用户凭证,创建我们自己的账号,启用远程桌面,进行屏幕截图,以及获取用户键盘记录等等. 相关Payl ...

  5. centos6.5环境下安装zk

    第一步:先下载安装包,解压. 第二步:进去根目录,创建data文件夹  mkdir  data 第三步:进去conf文件夹,修改  zoo_sample.cfg    的名字   mv zoo_sam ...

  6. Spark记录-Scala程序例子(函数/List/match/option/泛型/隐式转换)

    object func { def main(args:Array[String]):Unit={ //函数赋值给变量时, 必须在函数后面加上空格和下划线. def sayHello(name: St ...

  7. Linux记录-CentOS配置Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  8. vue-router源码分析

    上一篇我们写了前端路由,这几天比较闲,抽空研究了vue.js官方路由的vue-router的实现. 本文主要是以vue-router2.7.0(https://github.com/vuejs/vue ...

  9. 使用java.util.LinkedList模拟实现内存页面置换算法--LRU算法

    一,LRU算法介绍 LRU是内存分配中“离散分配方式”之分页存储管理方式中用到的一个算法.每个进程都有自己的页表,进程只将自己的一部分页面加载到内存的物理块中,当进程在运行过程中,发现某页面不在物理内 ...

  10. 电脑爱好——PE系统分区工具 分区时函数错误,报000000001错误 解决方法

    1.启动硬盘分区软件diskgenius(一般都是这个分区软件,这个PE系统自带的居多) 2.将现有的分区全部删掉 3.选择菜单栏——“硬盘”——“转换分区表类型为MBR格式”——转换完成 4.快速分 ...