WallPaper

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

原文地址:https://www.cnblogs.com/klcf0220/p/3252860.html