开发实时壁纸(Live Wallpapers)
所谓实时壁纸,就是指手机桌面不再是简单的图片,而是运行中的动画,这个动画是由程序实时绘制的,因此被称为实时壁纸。
为了开发实时壁纸,Android提供了WallpaperService基类,实时壁纸的实现类需要继承该基类,在Android应用中开发实时壁纸的步骤如下:
1、开发一个子类继承WallpaperService基类。
2、继承WallpaperService基类时必须重写onCreateEngine()方法,该方法返回WallpaperService.Engine子类对象。
3、开发者需要实现WallpaperService.Engine子类,并重写其中的public void onVisibilityChanged(boolean visible)、public void onOffsetsChanged()方法。不仅如此,由于WallpaperService.Engine子类采用了与SurfaceView相同的绘图机制,因此还可选择性地重写在SurfaceHolder.Callback中的三个方法。重写这些方法时可通过SurfaceHolder动态地绘制图形。
下面的Service类就代表了实时壁纸服务,程序代码如下:
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
public class LiveWallPaper extends WallpaperService{
//实现WallpaperService必须实现的抽象方法
@Override
public Engine onCreateEngine() {
// 返回自定义的Engine
return new MyEngine();
}
class MyEngine extends Engine{
//记录程序界面是否可见
private boolean mVisible;
//记录当前用户动作事件的发生位置
private float mTouchX = -1;
private float mTouchY = -1;
//记录当前圆圈的绘制位置
private float cx = 15;
private float cy = 20;
//定义画笔
private Paint mPaint = new Paint();
//定义一个Handler
Handler mHandler = new Handler();
//定义一个周期性执行的任务
private final Runnable drawTarget = new Runnable() {
@Override
public void run() {
drawFrame();
}
};
public void onCreate(android.view.SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
//初始化画笔
mPaint.setColor(0xffffffff);
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(2);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStyle(Paint.Style.STROKE);
//设置处理触摸事件
setTouchEventsEnabled(true);
};
@Override
public void onDestroy() {
super.onDestroy();
//删除回调
mHandler.removeCallbacks(drawTarget);
}
@Override
public void onVisibilityChanged(boolean visible) {
mVisible = visible;
//当界面可见时,执行drawFrame()方法
if(visible){
//动态地绘制图形
drawFrame();
}else{
//如果界面不可见,删除回调
mHandler.removeCallbacks(drawTarget);
}
}
@Override
public void onOffsetsChanged(float xOffset, float yOffset,
float xOffsetStep, float yOffsetStep, int xPixelOffset,
int yPixelOffset) {
drawFrame();
}
// //当屏幕大小改变时调用该方法
// @Override
// public void onSurfaceChanged(SurfaceHolder holder, int format,
// int width, int height) {
// super.onSurfaceChanged(holder, format, width, height);
// drawFrame();
// }
// @Override
// public void onSurfaceCreated(SurfaceHolder holder) {
// super.onSurfaceCreated(holder);
// }
// @Override
// public void onSurfaceDestroyed(SurfaceHolder holder) {
// super.onSurfaceDestroyed(holder);
// mVisible = false;
// mHandler.removeCallbacks(drawTarget);
// }
@Override
public void onTouchEvent(MotionEvent event) {
// 如果检测到滑动操作
if(event.getAction() == MotionEvent.ACTION_MOVE){
mTouchX = event.getX();
mTouchY = event.getY();
}else{
mTouchX = -1;
mTouchY = -1;
}
super.onTouchEvent(event);
}
//定义绘制图形的工具方法
private void drawFrame(){
//获取该壁纸的SurfaceHolder
final SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try {
//获取该壁纸的SurfaceHolder
c = holder.lockCanvas();
if(c != null){
c.save();
//绘制背景色
c.drawColor(0xff000000);
//在触碰点绘制圆圈
drawTouchPoint(c);
//绘制圆圈
c.drawCircle(cx, cy, 80, mPaint);
c.restore();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(c != null){
holder.unlockCanvasAndPost(c);
}
}
mHandler.removeCallbacks(drawTarget);
//调度下一次重绘
if(mVisible){
cx += 15;
cy += 20;
//如果cx、cy移除屏幕,从左上角重新开始
if(cx > 320){
cx = 15;
}
if(cy > 400){
cy = 20;
}
//指定0.1秒后重新执行mDrawCube一次
mHandler.postDelayed(drawTarget, 100);
}
}
//在屏幕触碰点绘制圆圈
private void drawTouchPoint(Canvas c){
if(mTouchX >= 0 && mTouchY >= 0){
c.drawCircle(mTouchX, mTouchY, 40, mPaint);
}
}
}
}
上面的程序中粗体字代码就是实现实时壁纸Service的关键代码,这两段粗体字代码重写了WallpaperService.Engine的onVisibilityChanged、onOffsetsChanged方法,并指定当桌面显示时调用drawFrame()方法进行绘制,drawFrame()方法绘制完成后通过Handler对象指定0.1秒后重绘。
上面的程序中被注释的代码是可有可无地,如果程序需要桌面的Surface改变事件提供响应,则可以考虑重写被注释代码。
定义了该Service类之后,接下来还需要在AndroidManifest.xml文件中配置该Service,配置实时壁纸Service与配置普通Service存在小小的区别。它需要指定如下两项:
1、指定运行实时壁纸需要android.permission.BIND_WALLPAPER权限。
2、为实时壁纸指定meta-data配置。
在AndroidManifest.xml文件中配置实时壁纸,也就是需要增加如下配置片段:
<!-- 配置实时壁纸Service -->
<service android:name=".LiveWallPaper"
android:label="@string/app_name"
android:permission="android.permission.BIND_WALLPAPER"
>
<!-- 为实时壁纸配置intent-filter -->
<intent-filter >
<action android:name="android.service.wallpaper.WallPapreService"/>
</intent-filter>
<!-- 为实时壁纸配置meta-filter -->
<meta-data
android:name="android.service.wallpaper"
android:resource="@xml/livewallpaper"
/>
</service>
上面的配置文件中粗体字配置部分就是配置实时壁纸的关键代码,上面的配置文件中指定了实时壁纸的meta-data放在@xml/livewallpaper中定义,因此程序还需要zaires\xml\目录下增加一个livewallpaper.xml文件,该代码如下:
<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmls:android="http://schemas.android.com/apk/res/android"/>
开发实时壁纸(Live Wallpapers)的更多相关文章
- Andoird开发手机壁纸
Android 开发手机壁纸3种方法 首先使用WallpaperManager wpm = (WallpaperManager) getActivity().getSystemService(Cont ...
- 使用Node.js的socket.io模块开发实时web程序
首发:个人博客,更新&纠错&回复 今天的思维漫游如下:从.net的windows程序开发,摸到nodejs的桌面程序开发,又熟悉了一下nodejs,对“异步”的理解有了上上周对操作系统 ...
- c# 利用AForge和百度AI开发实时人脸识别
baiduAIFaceIdentify项目是C#语言,集成百度AI的SDK利用AForge开发的实时人脸识别的小demo,里边包含了人脸检测识别,人脸注册,人脸登录等功能 人脸实时检测识别功能 思路是 ...
- 基于flink快速开发实时TopN程序
TopN 是统计报表和大屏非常常见的功能,主要用来实时计算排行榜.流式的TopN可以使业务方在内存中按照某个统计指标(如出现次数)计算排名并快速出发出更新后的排行榜. 我们以统计词频为例展示一下如何快 ...
- React开发实时聊天招聘工具 -第一章
第一章 课程道学 6个页面 弱化css Antd-mobile作为组件库 Redux 状态管理 React-Router 路由 Axios异步请求 后端Express框架 Socket.io 数据库: ...
- 大众点评Java开发实时应用监控平台-CAT
CAT介绍 CAT是基于Java开发的实时应用监控平台,包括实时应用监控,业务监控. CAT作为大众点评网基础监控组件,它已经在中间件框架(MVC框架,RPC框架,数据库框架,缓存框架等)中得到广泛应 ...
- flex4+fms3.5+cs4开发实时音视频直播及点播详解
开发工具及环境: 1)flash builder4 2)flash cs4 3)flash media server3.5 fms部分 fms是adobe的流媒体服务器,不过是收费的,价格大概是ora ...
- iOS开发——实时监控网速(仅作参考,发现一点问题)
开发中用到获取网速的地方,应该就两种: 1.下载速度,这种可以直接在接受数据的地方统计计算.这个就不讲了. 2.获取手机网卡的数据,可以监控网卡的进出流量,下面就是. #import "Vi ...
- React开发实时聊天招聘工具 -第二章
2-1 介绍React开发环境 npm install -g create-react-app xxx npm run eject 来配置webpack 2-2 ES6常用语法 其他 还有一些特性 ...
随机推荐
- 郑轻校赛题目 问题 G: 多少个0
问题 G: 多少个0 时间限制: 1 Sec 内存限制: 128 MB提交: 192 解决: 40 题目描述 一个n*n的方格,每个格子中间有一个数字是2或者5,现在从方格的左上角走到右下角,每次 ...
- C#学校班级自动升级实现代码
代码逻辑如下: //班级自动升级 //获取该学校还没有毕业的班级 List<ClassInfoes> classinfoeslist = classinfoesbll.GetList(Sc ...
- AppCan接入微信并且进行文字分享
AppCan接入微信并且进行文字分享 接入指引 实现简单的文字分享功能 接入指引 详情请参见:http://newdocx.appcan.cn/index.html?templateId=412 实现 ...
- Linux中执行shell脚本的4种方法
bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在 ...
- LeetCode----326. Power of Three(Java)
package isPowerOfThree326; /* Given an integer, write a function to determine if it is a power of th ...
- 整理课堂笔记 pl/sql orcale异常
1>>>>>异常错误处理 1 >预定义的异常处理 预定义说明的部分 ORACLE 异常错误对这种异常情况的处理,只需在PL/SQL块的异常处理部分,直接引用相应 ...
- python学习之字典
1.字典 列表存储的数据比较单一也不够灵活,这时我们可以使用字典来存储某些多内容的数据,字典是无顺序的 1.简单的字典 book={ 'huqiang':13457412571, 'Jasper':1 ...
- HDU 4944 FSF’s game 一道好题
FSF’s game Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tota ...
- python之redis
Redis简单介绍 如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构 ...
- SQL 是什么?
一.简介 SQL,Structured Query Language,结构化查询语言.