介绍

从 Android 2.1. (API Level 7) 开始,开发者就可以为 Android 手机创建动态墙纸——更丰富效果、动画和交互的背景。动态墙纸跟一个普通的 Android 应用差不多,你可以创建菜单设置、使用 SGL 和 OpenGL 绘图、使用加速度计等等。
在这篇文章中,我们将创建一个简单的动态墙纸应用,这个应用像是一个电视机的颜色测试界面,如下图所示。
How To Create Android Live Wallpaper
本文主要涉及以下几个部分内容:

  • 使用 Canvas 类绘制一些基本图形
  • 开发适合不同屏幕和分辨率以及方向的应用
  • 为动态墙纸创建设置对话框
  • 从 XML 资源文件读取不同的值
  • 创建动态墙纸应用

背景

你还可以在网上找到一些类似的应用,提供更全面的功能和效果:

使用代码

1. 新建 Android 虚拟设备 —— AVD
打开 Android SDK and AVD manager.
How To Create Android Live Wallpaper
按照如下信息创建 AVD

  1. 目标平台:Android 2.1 or higher
  2. 支持加速度计 (下一步我们还要添加屏幕旋转检测)
  3. 支持触摸屏

How To Create Android Live Wallpaper
选择任何一个分辨率,因为我们的程序将检测屏幕的分辨率并自动适应。
2. 创建项目文件
名为LiveWallpaper.
当创建 Android 项目时,选择 Build Target 为 Android 2.1.
How To Create Android Live Wallpaper
默认情况下,项目将包含如下文件:
How To Create Android Live Wallpaper
我们需要做一些更改,添加一些新文件。
首先删除 layout 目录以及 res 目录下的 main.xml 文件,我们要直接在应用中创建布局。
创建 xml 文件夹,并创建两个新文件:livewallpaper.xml 和 livewallpaper_settings.xml ,这两个文件包含服务的信息和设置对话框布局。
Livewallpaper.xml代码
< ?xml version="1.0" encoding="utf-8"?>

文件中的 wallpaper标签注明我们创建的是一个动态墙纸服务。
Livewallpaper_settings.xml代码
< ?xml version="1.0" encoding="utf-8"?>
文件中的ListPreference 为我们创建一个列表选项,而CheckBoxPreference 显示这些选项是开关选项(Yes/No)
在 values 目录下的 strings.xml 内容如下:
< ?xml version="1.0" encoding="utf-8"?>




Live Wallpaper
Settings
Select test pattern

Choose which test pattern to display

Motion

Apply movement to test pattern


你可以根据你使用的语言来修改这个文件。
同样在这个项目里,你还可以找到 testpattern.xml 文件,它包含电视测试模式的名称和颜色信息。
3. 看看代码
你可在我提供的代码中查看整个项目,下面提供的是一些重要的部分。
如何检测屏幕大小和方向?
你可以使用DisplayMetrics类
DisplayMetrics metrics = new DisplayMetrics();
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
display.getMetrics(metrics);
mRectFrame = new Rect(0, 0, metrics.widthPixels, metrics.heightPixels);
int rotation = display.getOrientation();
if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180)
mHorizontal = false;
else
mHorizontal = true;

使用GradientDrawable类绘制梯度效果:
private Rect mGradientRect;
GradientDrawable mGradient;
mGradientRect = new Rect(10,10, 40, 40);
mGradient = new GradientDrawable(Orientation.LEFT_RIGHT, new int[]
{ 0xff050505, 0xfffdfdfd });
mGradient.setBounds(mGradientRect);
mGradient.draw(c);

下面代码从 testpatterns.xml 中读取颜色值并让我们修改设置:
public void onSharedPreferenceChanged(SharedPreferences prefs,
String key)
{
mShape = prefs.getString("livewallpaper_testpattern", "smpte");
mMotion = prefs.getBoolean("livewallpaper_movement", true);
readColors();
}
private void readColors()
{
int pid = getResources().getIdentifier(mShape + "colors", "array", getPackageName());
rectColor = getResources().getIntArray(pid);
mRectCount = rectColor.length;
mColorRectangles = new Rect[mRectCount];
System.out.println("mRectCount "+mRectCount);
initFrameParams();
}

4. 编辑 AndroidManifest.xml
< ?xml version="1.0" encoding="utf-8"?>














上面内容非常重要的是设置android:permission=”android.permission.BIND_WALLPAPER”,这个设置项允许墙纸停留在手机首屏。
5. 运行结果
How To Create Android Live Wallpaper
How To Create Android Live Wallpaper

提示

Android 动态墙纸只在 Android 2.1 以及以后版本提供,你还需要如下的设置项来告诉 Android Market 你这是一个动态墙纸应用:

[dl href=’http://vdisk.weibo.com/s/n2tQ8′]下载本文源码[/dl]