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. 解码(ByteBuffer): CharsetDecoder.decode() 与 Charset.decode() 的不同

    今天测试的时候发现一个问题: ByteBuffer inputBuffer = ByteBuffer.allocate(1024); StringBuilder inputData = new Str ...

  2. 外显子分析弹错解决方案:Exception in thread "main" picard.PicardException: New reference sequence does not contain a matching contig for NC_007605

    最近从公共数据库下载了一堆bam文件和reference 基因组文件,重新分析外显子流程时,跑出了“Exception in thread "main" picard.Picard ...

  3. CSS3:文字属性

    文字属性注意的细节: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  4. python---session(tornado中使用)缓存

    session.py插件 # coding:utf8 # __author: Administrator # date: // # /usr/bin/env python import config ...

  5. C++面试集锦( 面试被问到的问题 )

    1. C 和 C++ 区别 2. const 有什么用途     主要有三点: 1:定义只读变量,即常量 2:修饰函数的参数和函数的返回值 3: 修饰函数的定义体,这里的函数为类的成员函数,被cons ...

  6. pycharm sql语句警告

    产生原因为没有配置数据库,配置数据库,似乎没什么作用 那么,直接去掉他的警告提示 找到setting->editor->inspections,然后找到右边sql下的 No data so ...

  7. 四、NAND Flash

    4.1 nand flash启动u-boot nand flash 启动的时候,CPU 需要将 nand flash 中前面 4KB 的内容复制到 SRAM 中执行,然后将 NAND Flash 中的 ...

  8. FineReport: 清空(重置)条件reset()

    在使用控件时,有时我们希望能够快捷的重置控件的内容,或者重置所有控件的内容,效果如下图所示: 1.给需要重置的控件设置控件名 2.给重置按钮设置点击事件 3.点击事件中加入javascript代码 只 ...

  9. js scroll函数

    $(function () { $(".sticky").hide(); var top = $(window).scrollTop(); if (top >= 100) { ...

  10. NOIP2018ty记

    前置传送门:noip2018前流水账 Day-inf~Day-3 写流水账里了 懒得再写了 Day-2~Day-1 做了些noip的原题 真是奇怪,我天天爱跑步和逛公园都是1A的,结果反而有些普及组的 ...