`
liuxin-smallmouse
  • 浏览: 18989 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android动态壁纸的制作教程

阅读更多

动态壁纸是在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 , onSurfaceCreatedonSurfaceDestroyed 方法。有了这些方法,动态壁纸才能展现出动画效果。而通过设置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动态壁纸的制作教程.pdf

    本教程将指导你如何制作一个交互式的动态壁纸应用。 首先,了解动态壁纸的基本架构。动态壁纸是一个Android应用程序,核心是`WallpaperService`服务。这个服务包含一个名为`WallpaperService.Engine`的组件,它扮演...

    安卓动态壁纸制作

    【安卓动态壁纸制作】 在安卓平台上,动态壁纸是一种可以为用户界面增添生动效果的特殊壁纸类型。它们不仅可以展示静态图像,还可以包含动画、交互元素甚至简单的游戏功能。本教程将深入探讨如何制作安卓动态壁纸,...

    手机动态壁纸大全精选.doc

    ### Android动态壁纸制作教程 创建Android动态壁纸涉及到的主要组件是`WallpaperService`和其内部的`Engine`类。下面是一些基本步骤: 1. **创建WallpaperService子类**:继承`WallpaperService`并创建一个新的...

    制作安卓动态壁纸

    5. **DIY_LiveWallpapers**:这可能是一个动态壁纸制作教程或者是一个辅助工具,指导你如何从头开始创建自己的动态壁纸。 在实际操作中,你可能需要结合这些工具,将图片、视频或GIF转化为适合Android系统的动态...

    Android动态桌面LiveWallpaper

    本教程将深入探讨如何制作Android动态壁纸,主要围绕以下几个核心知识点展开: 1. **LiveWallpaperService**:动态壁纸的核心组件是`LiveWallpaperService`,它继承自`Service`类。开发者需要在这个服务中实现壁纸...

    安卓android手机主题制作教程

    【安卓Android手机主题制作教程】 安卓Android手机主题制作教程是一篇详细介绍如何自定义MIUI主题的指南,适合那些想要打造个性化手机界面的用户。MIUI是基于Android系统的一个深度定制界面,提供了丰富的主题...

    零基础学动态壁纸制作-故宫飘雪-素材.zip

    动态壁纸制作是一个趣味性和技术性并存的领域,尤其对于喜欢个性化手机或电脑桌面的用户来说,自制的动态壁纸能够展现独特的个人风格。本教程"零基础学动态壁纸制作-故宫飘雪-素材.zip"旨在帮助初学者了解并掌握动态...

    使用yaffs2img工具制作Android刷机包教程

    【使用yaffs2img工具制作Android刷机包教程】 Android刷机包是为自定义或优化Android系统而创建的,通常包含系统核心组件、应用程序、个性化设置等。本教程将指导你如何利用yaffs2img工具制作自己的Android刷机包。...

    android手机百变锁屏

    5. **动画效果**:Android提供了多种动画库,如Property Animation和Transition API,用于创建滑动、淡入淡出等动态效果,提升用户体验。 6. **权限管理**:锁屏应用可能需要访问设备的一些敏感权限,如读取联系人...

    安卓开发从入门到精通教程

    【安卓开发从入门到精通教程】是一篇针对Android新手的指南,旨在帮助用户熟悉和掌握Android设备的使用和开发。这篇教程主要分为以下几个部分: 1. **数据迁移**: - 初步接触Android手机后,教程建议首先将旧手机...

    Hello, Android: Introducing Google's Mobile Development Platform

    3. **最新技术**:第三版更新了所有示例代码,确保与最新的Android版本兼容,并新增了安装应用到SD卡、支持多点触控和创建动态壁纸等内容。 4. **实战指南**:不仅涵盖了基础知识,还提供了将应用发布到Android市场...

    安卓ROM制作九大教程

    安卓ROM制作九大教程 本教程涵盖了安卓ROM制作的九大方面,包括ROM的基础知识、ROM的美化、ROM的自定义等。通过本教程,读者将了解到ROM的基本概念、如何删除不需要的软件、如何添加新的软件、如何美化ROM、如何...

    webos主题制作教程

    ### webOS主题制作教程 #### 1. webOS主题概览 ##### 1.1 webOS系统主题的本质 webOS,作为一款先进的智能手机操作系统,其主题设计与传统的Android或Symbian系统有所不同。webOS的主题更像是一个补丁包,由一...

    教你如何制作安卓rom教程

    【安卓ROM制作与美化教程详解】 制作个性化的安卓ROM,让你的手机更加符合个人喜好,不仅可以删除不常用的应用,还能添加自己喜欢的软件,甚至对系统界面进行深度美化。以下是详细的步骤指南: 一、删除和添加应用...

    alynx-live-wallpaper:一个允许您选择视频作为墙纸的Android应用

    Alynx动态壁纸 允许您选择视频作为墙纸的Android应用。 需要GLESv2或更高版本的支持来裁剪视频大小。 注意 这与大多数教程中所说的“构建一个安卓视频墙纸”不同,它不是一个演示,只是创建了一个以...

    安卓Android源码——100种图片处理效果大全项目.zip

    《安卓Android源码——100种图片处理效果大全项目》是一个专为Android开发者设计的实践教程,旨在帮助开发者掌握各种图像处理技术。这个项目包含了100个不同的示例,每个示例都展示了Android平台上的独特图片处理...

    Android例子源码图片转换成视频实现屏幕录像.rar

    在Android平台上,将图片序列转换成视频并实现屏幕录像是一项常见的需求,比如游戏录制、教程制作或者动态壁纸的创建。这个"Android例子源码图片转换成视频实现屏幕录像.rar"压缩包提供了一个实用的示例,帮助开发者...

Global site tag (gtag.js) - Google Analytics