从 Android 2.1. (API Level 7) 开始,开发者就可以为 Android 手机创建动态墙纸——更丰富效果、动画和交互的背景。动态墙纸跟一个普通的 Android 应用差不多,你可以创建菜单设置、使用 SGL 和 OpenGL 绘图、使用加速度计等等。
在这篇文章中,我们将创建一个简单的动态墙纸应用,这个应用像是一个电视机的颜色测试界面,如下图所示。
本文主要涉及以下几个部分内容:
你还可以在网上找到一些类似的应用,提供更全面的功能和效果:
打开 Android SDK and AVD manager.
按照如下信息创建 AVD
选择任何一个分辨率,因为我们的程序将检测屏幕的分辨率并自动适应。
名为LiveWallpaper.
当创建 Android 项目时,选择 Build Target 为 Android 2.1.
默认情况下,项目将包含如下文件:
我们需要做一些更改,添加一些新文件。
首先删除 layout 目录以及 res 目录下的 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标签注明我们创建的是一个动态墙纸服务。
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 显示这些选项是开关选项(Yes/No)
在 values 目录下的 strings.xml 内容如下:
<?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 文件,它包含电视测试模式的名称和颜色信息。
你可在我提供的代码中查看整个项目,下面提供的是一些重要的部分。
如何检测屏幕大小和方向?
你可以使用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(); }
<?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",这个设置项允许墙纸停留在手机首屏。
Android 动态墙纸只在 Android 2.1 以及以后版本提供,你还需要如下的设置项来告诉 Android Market 你这是一个动态墙纸应用:
<uses-feature android:name="android.software.live_wallpaper" />
下载本文源码:http://www.oschina.net/code/snippet_12_9430
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务