看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的,其实我们自己也可以实现。

一、动态壁纸原理

如果你了解使用过SurfaceView的话,那么开发一款动态壁纸对你来说其实非常简单。

动态壁纸的本质其实就是一个服务在维护一个动态壁纸引擎Engine,所以我们看到的动态效果其实是通过这个引擎画出来的。而维护这个引擎的服务,就是WallpaperService。本篇文章并不讨论内部实现原理,只是让大家知道如何去实现动态壁纸,所以就不详细说了。

二、实现动态壁纸

大体上可分为三个步骤:

创建自定义WallpaperService继承WallpaperService
在Manifest中注册该Service并添加相关属性
创建所需要的xml文件
1.创建自定义WallpaperService

public class MyLwp extends WallpaperService {
@Override
public Engine onCreateEngine() {
return new MyEngine();
}

class MyEngine extends  Engine{@Overridepublic SurfaceHolder getSurfaceHolder() {return super.getSurfaceHolder();}@Overridepublic void onCreate(SurfaceHolder surfaceHolder) {super.onCreate(surfaceHolder);}@Overridepublic void onDestroy() {super.onDestroy();}@Overridepublic void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {super.onSurfaceChanged(holder, format, width, height);}@Overridepublic void onSurfaceCreated(SurfaceHolder holder) {super.onSurfaceCreated(holder);}@Overridepublic void onSurfaceDestroyed(SurfaceHolder holder) {super.onSurfaceDestroyed(holder);}
}

}
2.Manifest注册

    <serviceandroid:name=".MyLwp"android:enabled="true"android:permission="android.permission.BIND_WALLPAPER"><intent-filter><action android:name="android.service.wallpaper.WallpaperService" /></intent-filter><meta-dataandroid:name="android.service.wallpaper"android:resource="@xml/livewallpapervideo" /></service>

一定要添加的几个地方:permission、intent-filter、meta-data。

3.创建需要的xml文件

这个xml文件就是Manifest中meta-data中的resource需要的文件:

<?xml version="1.0" encoding="utf-8"?>

需要注意第二个属性:settingsActivity,这个属性可以设置也可以不设置,他是启动一个设置动态壁纸的界面,一般情况下其实用不到这个界面,我们一般会使用PreferenceActivity去实现。下面是添加该属性和不添加该属性的区别:

完成这些之后,就是我们设计动态壁纸的时候了。回到自定义的Wallpaper类中:

我们当时在类中自定义了一个内部类MyEngine继承自Engine。这个Engine就是用来绘制的。关于Engine的几个主要方法如下:

class MyEngine extends  Engine{//获取SurfaceHolder时调用@Overridepublic SurfaceHolder getSurfaceHolder() {return super.getSurfaceHolder();}//手势移动时回调@Overridepublic void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);}//Surface创建时回调@Overridepublic void onSurfaceCreated(SurfaceHolder holder) {super.onSurfaceCreated(holder);}//Surface销毁时回调@Overridepublic void onSurfaceDestroyed(SurfaceHolder holder) {super.onSurfaceDestroyed(holder);}
}

onOffsetsChanged要注意一下,还记得有的手机滑动桌面时候背景图片会跟着左右移动吗,这个方法就可以实现这个效果,在手势滑动的每一帧都会回调依次。一下是个人理解的参数的含义:

xOffset:x方向滑动的百分比(与桌面分页数有关)

yOffset:y方向滑动百分比(一般用不到)

xOffsetStep:x方向每个分页所占的百分比(1 / xOffsetStep = 桌面的分页数)

yOffsetStep:同

xPixelOffset:x放下像素偏移量

y。。。。。

4.绘制。

实现绘制的方式,就跟SurfaceView的绘制一样了:

    @Overridepublic void onSurfaceCreated(SurfaceHolder holder) {super.onSurfaceCreated(holder);Canvas canvas = holder.lockCanvas();canvas.drawColor(Color.RED);holder.unlockCanvasAndPost(canvas);}

我只是简单的话了一个红色背景,效果如下:

当然可以实现很多不同的效果,这个就根据不同的需求去实现了。

看到有些手机酷炫的动态壁纸,有没有好奇过他们是如何实现的相关推荐

  1. ios解锁动态图片_iPhone不越狱如何设置酷炫的动态锁屏壁纸

    原标题:iPhone不越狱如何设置酷炫的动态锁屏壁纸 果粉学堂 在大安卓几百年前就可以实现的动态锁屏功能,iPhone才姗姗来迟,这不得不说苹果的系统,对于安卓用户来说,这个已经用烂了的功能在苹果上还 ...

  2. Lively Wallpaper ---- 超酷炫的桌面壁纸

    最近在github 上找到一个超酷炫的桌面壁纸程序,支持各种格式的素材作为壁纸 下载链接: https://github.com/rocksdanister/lively/releases/tag/v ...

  3. 酷狗音乐动态壁纸脱离酷狗音乐独立运行

    这个酷狗音乐动态壁纸真是太好看了,用上了就再也不想回到原来枯燥的静态壁纸了.可是这个动态壁纸想要不掉,就要保持酷狗音乐开机自启还要一直保持后台运行,这简直像极了霸王条款... 对于我这个本本来说,我确 ...

  4. 用HTML、CSS写一个酷炫的动态搜索框

    用HTML.CSS写一个酷炫的动态搜索框 可伸展的动态搜索框! 复制粘贴即可用! HTML部分: <!DOCTYPE html> <html lang="en"& ...

  5. 华为手机怎么导入主题_如何在华为手机上设置主题动态壁纸

    许多智能手机现在可以设置动态桌面墙纸,您还可以选择自己喜欢的桌面主题. 很多用户经常使用系统随附的主题界面后会感到呆板,因此他们想自己设置一些不同的主题界面,还可以自定义一些动态锁屏墙纸. 但是,有很 ...

  6. 关于酷狗的动态壁纸的代码(罗马时钟)

    关于酷狗的动态壁纸的代码(罗马时钟) 可以自行换图片哦 话不多说,上代码 首先我们先看到酷狗的示例文件,需要一个css的文件和js的文件,img是你自己要的图片,如果要修改,记得重命名 margin: ...

  7. 手机3D碎屏动态壁纸,随着手机晃动变幻的3D特效!科技感十足!

    上次我们分享了视频桌面壁纸.今天,给大家带来更加炫酷的壁纸--3D碎屏动态壁纸,随重力变化呈现3D特效,科技感十足! 适用系统:安卓 演示机型:魅族MX6 一.3D碎屏动态壁纸 第一步当然是下载安装软 ...

  8. 电脑版桌面罗盘时钟-超酷炫的桌面壁纸…

    前段时间,用python做了个罗盘时钟,但好多小伙伴希望能做个桌面壁纸版的.由于本人不是专业的码农,对操作系统的壁纸嵌入这块理解有限,做起来并不容易.现从网上使用别人分享的html+css+js代码[ ...

  9. 动态箭头gif图标_别以为只有专业人士才能做出酷炫的#动态跑分图#

    如果经常关注数据可视化的话,你可能会发现一种流行的动态图表形式--动态跑分图(bar chart race).这种动态图表的精髓是,通过数据范围的变化(通常是以日期为主),以条形图展现各数据序列间的关 ...

最新文章

  1. 题解——HDU 1848 Fibonacci again and again
  2. IOS引导页拨动4张图片最后一张停三秒进入主页,页面推送
  3. HLG2081分苹果
  4. android:textAppearance设置文字外观
  5. js实现星级评分效果(非常规5个li代码)
  6. C#DotNetBar TabControl将水平标签设置成竖直
  7. mysql---批量插入数据:100w条数据
  8. JSR 310新日期/时间API的自定义JSR 303 Bean验证约束
  9. python win7 win10_Python如何获取Win7,Win10系统缩放大小
  10. JavaScript and CSS
  11. 挖掘11亿用户背后的产品逻辑之美
  12. IE无法执行JavaScript解决办法
  13. 基于网络的 Red Hat 无人值守安装
  14. 磁盘加密软件(Secret Disk Pro 2020) v2020.03
  15. C++ 7:深拷贝和浅拷贝,,值类型,构造函数和拷贝构造函数,函数重载,移动构造函数和移动赋值函数
  16. html优秀作品展示,31个漂亮的作品展示网页设计
  17. ES06# Filebeat采集原理与监控指标梳理
  18. 微信小程序如何解析标签?
  19. 阿里大手子评:入门到大成!GitHub新上线并发编程深度解析实战PDF
  20. 牛客网 15029 (栈)

热门文章

  1. 期刊论文发表的第一作者和通讯作者哪个更重要
  2. Bugku -分析-合集
  3. 【无服务器架构】openwhisk 经典使用案例
  4. matlab实验答案第三章,matlab第三章答案
  5. 指代消解《End-to-end Neural Coreference Resolution》
  6. 快递分拣机器人系统运用了哪些计算机技术,自动分拣十几秒完成 快递机器人何日满城“跑”...
  7. 一个 print 函数,挺会玩啊?
  8. 米家机器人连接不上了怎么重置_米家扫地机器人怎么重置wifi_米家扫地机器人wifi怎么重置...
  9. ES空字符串和null值查询
  10. AcWing 378. 骑士放置(最大独立集)