如何创建Android动态壁纸






4.82/5 (124投票s)
面向绝对初学者的Android动态壁纸创建分步指南。

引言
从 Android 2.1(API 级别 7)开始,开发者可以在主屏幕上创建**动态壁纸** - 更丰富、动画化、可交互的背景。动态壁纸与普通 Android 应用程序非常相似:您可以创建带有设置的菜单,使用 SGL 和 OpenGL 进行绘图,使用加速度计等。
在本文中,我想演示如何从零开始创建动态壁纸。我们将一步一步地创建一个可以在主屏幕上输出电视测试图案的动态壁纸。就像晚上真正的电视一样!本文将重点介绍动态壁纸开发的以下方面:
- 使用
android.graphics.Canvas
类在图形图元(圆形、矩形)上绘图 - 开发适用于不同分辨率和方向的屏幕的应用程序
- 创建动态壁纸的设置对话框
- 读取资源 XML 文件中的变量值
- 实际创建 Android 动态壁纸
背景
在本文中,我将展示如何创建一个非常简单的动态壁纸。
在互联网上,您可以找到更多深入和更酷的应用,但我希望您查看以下示例:
- CubeLiveWallpaper - Android SDK 示例
- 马里奥动态壁纸 - 太棒了!!!
- AndEngine 动态壁纸 - 使用 AndEngine 创建动态壁纸
Using the Code
1. 创建 Android 虚拟设备
如前所述,我们必须创建一个合适的Android 虚拟设备 (AVD) 来运行我们的应用程序。
打开 Android SDK 和 AVD 管理器。
并创建一个具有以下功能的 AVD:
- 目标平台:Android 2.1 或更高版本
- 支持加速度计(我们将添加对屏幕旋转检测的支持)
- 支持触摸屏
分辨率可以是任意的。我们的应用程序将检测屏幕分辨率并根据需要缩放图形元素。
2. 创建项目文件
我将应用程序命名为LiveWallpaper
。
创建 Android 项目时,将构建目标设置为Android 2.1。
默认情况下,项目将使用以下文件创建:
我们需要对它们进行一些修改,并添加包含应用程序变量值的新文件。
首先,删除res目录下的layout文件夹和main.xml文件。此文件用于创建我们项目中不使用的应用程序控件的布局。
取而代之的是,创建一个xml文件夹,我们在其中创建两个文件livewallpaper.xml和livewallpaper_settings.xml,它们将包含动态壁纸服务和设置对话框的值。
Livewallpaper.xml包含以下数据:
<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
android:settingsActivity="ca.jvsh.livewallpaper.LiveWallpaperSettings"
android:thumbnail="@drawable/icon"/>
其中wallpaper
标签表示我们正在创建动态壁纸服务。此文件将在apk 文件创建期间进行处理。
Livewallpaper_settings.xml包含我们动态壁纸可用设置的描述:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/livewallpaper_settings"
android:key="livewallpaper_settings">
<ListPreference
android:key="livewallpaper_testpattern"
android:title="@string/livewallpaper_settings_title"
android:summary="@string/livewallpaper_settings_summary"
android:entries="@array/livewallpaper_testpattern_names"
android:entryValues="@array/livewallpaper_testpattern_prefix"/>
<CheckBoxPreference android:key="livewallpaper_movement"
android:summary="@string/livewallpaper_movement_summary"
android:title="@string/livewallpaper_movement_title"
android:summaryOn="Moving test pattern"
android:summaryOff="Still test pattern"/>
</PreferenceScreen>
其中ListPreference
标签表示我们提供给用户选择多个项目的选项,而CheckBoxPreference
标签表示我们有一个复选框(是/否)选项。
values文件夹中的strings.xml文件包含我们项目中使用的所有string
值。
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- General -->
<skip />
<!-- Application name -->
<string name="app_name">Live Wallpaper</string>
<string name="livewallpaper_settings">Settings</string>
<string name="livewallpaper_settings_title">Select test pattern</string>
<string name="livewallpaper_settings_summary">
Choose which test pattern to display</string>
<string name="livewallpaper_movement_title">Motion</string>
<string name="livewallpaper_movement_summary">
Apply movement to test pattern</string>
</resources>
您可以在本地化软件时修改此文件。
此外,在项目中,您会找到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);
看看这段代码:
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();
}
当我们更改设置时,会调用这些函数。
在readColors()
函数中,我们正在从资源(testpatterns.xml文件)读取颜色值。
4. 编辑 AndroidManifest.xml
提供一个合适的AndroidManifest.xml文件是您的应用程序被 Android Market 接受的关键点。
在我们的项目中,Android Manifest 如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ca.jvsh.livewallpaper"
android:versionName="1.0.20100908.1"
android:versionCode="1">
<uses-sdk android:minSdkVersion="7" />
<uses-feature android:name="android.software.live_wallpaper" />
<application android:icon="@drawable/icon"
android:label="@string/app_name"
android:permission="android.permission.BIND_WALLPAPER">
<service android:name=".LiveWallpaper"
android:label="@string/app_name"
android:icon="@drawable/icon">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data android:name="android.service.wallpaper"
android:resource="@xml/livewallpaper" />
</service>
<activity android:label="@string/livewallpaper_settings"
android:name=".LiveWallpaperSettings"
android:theme="@android:style/Theme.Light.WallpaperSettings"
android:exported="true"
android:icon="@drawable/icon">
</activity>
</application>
</manifest>
设置 android:permission="android.permission.BIND_WALLPAPER"
非常重要,因为这将允许壁纸保留在您的主屏幕上。
5. 结果
关注点
Android 动态壁纸仅在 Android 2.1(API 级别 7)及更高版本的平台上受支持。为了确保您的应用程序只能安装在支持动态壁纸的设备上,在发布到 Android Market 之前,请记住在应用程序的 Manifest 中添加指示 Android Market 和平台您的应用程序需要 Android 2.1 或更高版本。
<uses-feature android:name="android.software.live_wallpaper" />
这会告诉 Android Market 您的应用程序包含动态壁纸。
历史
- 2010.08.09 首次提交示例