动态壁纸是在Android 2.1新增的一个功能。动态壁纸可以添加到Android的桌面,具有交互式的动画背景效果。在本教程中,我们将教会你如何去制作一个交互式的动态壁纸。
动态壁纸是一个Android应用程序,包括一个服务(WallpaperService
)。该服务必须包括一个引擎(WallpaperService.Engine
)。该引擎是连接用户、桌面、系统之间的桥梁。它也可以绘制桌面壁纸。
首先,必须由内在的Engine类创建一个WallpaperService类。该服务必须在AndroidManifest.xml中声明
为"android.service.wallpaper.WallpaperService",这样它才会作为动态壁纸被手机识别。而且还要在服务配置
中附加"android.permission.BIND_WALLPAPER"的权限许可:
<service
android:name="LiveWallpaperService"
android:enabled="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:permission="android.permission.BIND_WALLPAPER">
<intent-filter android:priority="1" >
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data
android:name="android.service.wallpaper"
android:resource="@xml/wallpaper" />
</service>
创建一个XML文件,放置在应用程序目录下的/res/xml/
中。它用来描述你的动态壁纸。
<?xml version="1.0" encoding="UTF-8"?>
<wallpaper
xmlns:android="http://schemas.android.com/apk/res/android "
android:thumbnail="@drawable/thumbnail"
android:description="@string/description"
android:settingsActivity="PreferenceActivity"/>
再创建一个xml的属性文件 attrs.xml
,代码如下:
<declare-styleable name="Wallpaper">
<!-- Component name of an activity that allows the user to modify
the current settings for this wallpaper. -->
<attr name="settingsActivity" />
<!-- Reference to a the wallpaper's thumbnail bitmap. -->
<attr name="thumbnail" format="reference" />
<!-- Name of the author of this component, e.g. Google. -->
<attr name="author" format="reference" />
<!-- Short description of the component's purpose or behavior. -->
<attr name="description" />
</declare-styleable>
动态壁纸的服务代码如下:
package net.androgames.blog.sample.livewallpaper;
import android.content.SharedPreferences;
import android.service.wallpaper.WallpaperService;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
/**
* Android Live Wallpaper Archetype
* @author antoine vianey
* under GPL v3 : http://www.gnu.org/licenses/gpl-3.0.html
*/
public class LiveWallpaperService extends WallpaperService {
@Override
public Engine onCreateEngine() {
return new SampleEngine();
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}
public class SampleEngine extends Engine {
private LiveWallpaperPainting painting;
SampleEngine() {
SurfaceHolder holder = getSurfaceHolder();
painting = new LiveWallpaperPainting(holder,
getApplicationContext());
}
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
// register listeners and callbacks here
setTouchEventsEnabled(true);
}
@Override
public void onDestroy() {
super.onDestroy();
// remove listeners and callbacks here
painting.stopPainting();
}
@Override
public void onVisibilityChanged(boolean visible) {
if (visible) {
// register listeners and callbacks here
painting.resumePainting();
} else {
// remove listeners and callbacks here
painting.pausePainting();
}
}
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
super.onSurfaceChanged(holder, format, width, height);
painting.setSurfaceSize(width, height);
}
@Override
public void onSurfaceCreated(SurfaceHolder holder) {
super.onSurfaceCreated(holder);
// start painting
painting.start();
}
@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
boolean retry = true;
painting.stopPainting();
while (retry) {
try {
painting.join();
retry = false;
} catch (InterruptedException e) {}
}
}
@Override
public void onOffsetsChanged(float xOffset, float yOffset,
float xStep, float yStep, int xPixels, int yPixels) {
}
@Override
public void onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
painting.doTouchEvent(event);
}
}
}
当壁纸的显示、状态或大小变化是,会调用Engine的onCreate
, onDestroy
, onVisibilityChanged
, onSurfaceChanged
, onSurfaceCreated
和 onSurfaceDestroyed
方法。有了这些方法,动态壁纸才能展现出动画效果。而通过设置setTouchEventsEnabled(true),
并且调用onTouchEvent(MotionEvent event)
方法,来激活触摸事件。
我们在绘画墙纸的时候,也会使用一个单独的绘画线程:
package net.androgames.blog.sample.livewallpaper;
import android.content.Context;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
/**
* Android Live Wallpaper painting thread Archetype
* @author antoine vianey
* GPL v3 : http://www.gnu.org/licenses/gpl-3.0.html
*/
public class LiveWallpaperPainting extends Thread {
/** Reference to the View and the context */
private SurfaceHolder surfaceHolder;
private Context context;
/** State */
private boolean wait;
private boolean run;
/** Dimensions */
private int width;
private int height;
/** Time tracking */
private long previousTime;
private long currentTime;
public LiveWallpaperPainting(SurfaceHolder surfaceHolder,
Context context) {
// keep a reference of the context and the surface
// the context is needed if you want to inflate
// some resources from your livewallpaper .apk
this.surfaceHolder = surfaceHolder;
this.context = context;
// don't animate until surface is created and displayed
this.wait = true;
}
/**
* Pauses the live wallpaper animation
*/
public void pausePainting() {
this.wait = true;
synchronized(this) {
this.notify();
}
}
/**
* Resume the live wallpaper animation
*/
public void resumePainting() {
this.wait = false;
synchronized(this) {
this.notify();
}
}
/**
* Stop the live wallpaper animation
*/
public void stopPainting() {
this.run = false;
synchronized(this) {
this.notify();
}
}
@Override
public void run() {
this.run = true;
Canvas c = null;
while (run) {
try {
c = this.surfaceHolder.lockCanvas(null);
synchronized (this.surfaceHolder) {
currentTime = System.currentTimeMillis();
updatePhysics();
doDraw(c);
previousTime = currentTime;
}
} finally {
if (c != null) {
this.surfaceHolder.unlockCanvasAndPost(c);
}
}
// pause if no need to animate
synchronized (this) {
if (wait) {
try {
wait();
} catch (Exception e) {}
}
}
}
}
/**
* Invoke when the surface dimension change
*/
public void setSurfaceSize(int width, int height) {
this.width = width;
this.height = height;
synchronized(this) {
this.notify();
}
}
/**
* Invoke while the screen is touched
*/
public void doTouchEvent(MotionEvent event) {
// handle the event here
// if there is something to animate
// then wake up
this.wait = false;
synchronized(this) {
notify();
}
}
/**
* Do the actual drawing stuff
*/
private void doDraw(Canvas canvas) {}
/**
* Update the animation, sprites or whatever.
* If there is nothing to animate set the wait
* attribute of the thread to true
*/
private void updatePhysics() {
// if nothing was updated :
// this.wait = true;
}
}
如果桌面壁纸是可见状态下,系统服务通知有新的东西,这个类会优先把它绘制在画布上。如果没有动画了,updatePhysics
会通知线程去等待。通常SurfaceView在有两个画布交替绘制的时候,会在画布上绘制上一次......
如果要让你的动态墙纸有配置功能,只要创建一个PreferenceActivity
,并将它在wallpaper.xml文件中声明。同时让SharedPreference
对象可以找到你的配置选项。
教程就写到这里,如果还有什么不懂,你可以通过Eclipse来浏览完整的源代码:SampleLiveWallpaper
。
转载:http://my.oschina.net/liux/blog/40230
分享到:
相关推荐
本教程将指导你如何制作一个交互式的动态壁纸应用。 首先,了解动态壁纸的基本架构。动态壁纸是一个Android应用程序,核心是`WallpaperService`服务。这个服务包含一个名为`WallpaperService.Engine`的组件,它扮演...
【安卓动态壁纸制作】 在安卓平台上,动态壁纸是一种可以为用户界面增添生动效果的特殊壁纸类型。它们不仅可以展示静态图像,还可以包含动画、交互元素甚至简单的游戏功能。本教程将深入探讨如何制作安卓动态壁纸,...
### Android动态壁纸制作教程 创建Android动态壁纸涉及到的主要组件是`WallpaperService`和其内部的`Engine`类。下面是一些基本步骤: 1. **创建WallpaperService子类**:继承`WallpaperService`并创建一个新的...
5. **DIY_LiveWallpapers**:这可能是一个动态壁纸制作教程或者是一个辅助工具,指导你如何从头开始创建自己的动态壁纸。 在实际操作中,你可能需要结合这些工具,将图片、视频或GIF转化为适合Android系统的动态...
本教程将深入探讨如何制作Android动态壁纸,主要围绕以下几个核心知识点展开: 1. **LiveWallpaperService**:动态壁纸的核心组件是`LiveWallpaperService`,它继承自`Service`类。开发者需要在这个服务中实现壁纸...
【安卓Android手机主题制作教程】 安卓Android手机主题制作教程是一篇详细介绍如何自定义MIUI主题的指南,适合那些想要打造个性化手机界面的用户。MIUI是基于Android系统的一个深度定制界面,提供了丰富的主题...
动态壁纸制作是一个趣味性和技术性并存的领域,尤其对于喜欢个性化手机或电脑桌面的用户来说,自制的动态壁纸能够展现独特的个人风格。本教程"零基础学动态壁纸制作-故宫飘雪-素材.zip"旨在帮助初学者了解并掌握动态...
【使用yaffs2img工具制作Android刷机包教程】 Android刷机包是为自定义或优化Android系统而创建的,通常包含系统核心组件、应用程序、个性化设置等。本教程将指导你如何利用yaffs2img工具制作自己的Android刷机包。...
5. **动画效果**:Android提供了多种动画库,如Property Animation和Transition API,用于创建滑动、淡入淡出等动态效果,提升用户体验。 6. **权限管理**:锁屏应用可能需要访问设备的一些敏感权限,如读取联系人...
【安卓开发从入门到精通教程】是一篇针对Android新手的指南,旨在帮助用户熟悉和掌握Android设备的使用和开发。这篇教程主要分为以下几个部分: 1. **数据迁移**: - 初步接触Android手机后,教程建议首先将旧手机...
3. **最新技术**:第三版更新了所有示例代码,确保与最新的Android版本兼容,并新增了安装应用到SD卡、支持多点触控和创建动态壁纸等内容。 4. **实战指南**:不仅涵盖了基础知识,还提供了将应用发布到Android市场...
安卓ROM制作九大教程 本教程涵盖了安卓ROM制作的九大方面,包括ROM的基础知识、ROM的美化、ROM的自定义等。通过本教程,读者将了解到ROM的基本概念、如何删除不需要的软件、如何添加新的软件、如何美化ROM、如何...
### 安卓手机ROM制作教程 #### 一、制作目的 - **培养兴趣与快乐**:通过亲手制作ROM,能够激发个人对技术的兴趣,并从中体验解决问题的乐趣。 - **学习手机知识**:掌握必要的手机硬件与软件知识,为将来进一步...
- **Android根文件系统的制作** - 从虚拟机中提取`data`分区。 - 根据需要自定义根文件系统。 - **Android下SD卡支持** - 在内核配置中启用SD卡支持。 - 在用户空间实现SD卡读写功能。 - **ALSA声卡的支持** ...
### webOS主题制作教程 #### 1. webOS主题概览 ##### 1.1 webOS系统主题的本质 webOS,作为一款先进的智能手机操作系统,其主题设计与传统的Android或Symbian系统有所不同。webOS的主题更像是一个补丁包,由一...
【安卓ROM制作与美化教程详解】 制作个性化的安卓ROM,让你的手机更加符合个人喜好,不仅可以删除不常用的应用,还能添加自己喜欢的软件,甚至对系统界面进行深度美化。以下是详细的步骤指南: 一、删除和添加应用...
Alynx动态壁纸 允许您选择视频作为墙纸的Android应用。 需要GLESv2或更高版本的支持来裁剪视频大小。 注意 这与大多数教程中所说的“构建一个安卓视频墙纸”不同,它不是一个演示,只是创建了一个以...
《安卓Android源码——100种图片处理效果大全项目》是一个专为Android开发者设计的实践教程,旨在帮助开发者掌握各种图像处理技术。这个项目包含了100个不同的示例,每个示例都展示了Android平台上的独特图片处理...
在Android平台上,将图片序列转换成视频并实现屏幕录像是一项常见的需求,比如游戏录制、教程制作或者动态壁纸的创建。这个"Android例子源码图片转换成视频实现屏幕录像.rar"压缩包提供了一个实用的示例,帮助开发者...