anita-austvika-1132037-unsplash.jpg

最近搞了一下Android的动态壁纸,像实现“萤火视频桌面”那样,本来以为很难的,但是了解了一下感觉还是很容易的。

Android壁纸的实现和管理分为三层:

只想了解动态壁纸的看第一个就好了

WallpaperService与Engine

壁纸运行在一个Android服务之中,这个服务的名字叫做WallpaperService。当用户选择了一个壁纸之后,此壁纸所对应的WallpaperService便会启动并开始进行壁纸的绘制工作。Engine是WallpaperService中的一个内部类,实现了壁纸窗口的创建以及Surface的维护工作。这一层次的内容主要体现了壁纸的实现原理。

WallpaperManagerService

这个系统服务用于管理壁纸的运行与切换,并通过WallpaperManager类向外界提供操作壁纸的接口。这一层次主要体现了Android对壁纸的管理方式。

WindowManagerService

用于计算壁纸窗口的Z序、可见性以及为壁纸应用窗口动画。这一层次主要体现了Android对壁纸窗口的管理方式。

实现

首先静态壁纸是很简单的,大概就是如下几种方法,我也没有试过,

使用WallpaperManager的setResource(int ResourceID)方法

使用WallpaperManager的setBitmap(Bitmap bitmap)方法

使用WallpaperManager的setStream(InputStream data)方法

//需要权限

WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);

try {

wallpaperManager.setResource(R.drawable.picture);

} catch (IOException e) {

e.printStackTrace();

}

动态壁纸

刚才讲了,动态壁纸就是一个服务,我们先创建一个服务并继承WallpaperService。这个服务里面有个内部类Engine,实现了壁纸窗口的创建以及Surface的维护工作。就是说我们可以获取到一个SurfaceHolder,拿到这个东西就好办了,我们可以在上面画自己想要的东西或者把视频输出到上面去。

我就直接上代码了

设置视频桌面

public class VideoWallpaper extends WallpaperService {

private MediaPlayer mp;

private int progress = 0;

//这里就是返回我们自定义的Engine

@Override

public Engine onCreateEngine() {

return new VideoEngine();

}

//自定义Engine

class VideoEngine extends Engine {

@Override

public void onCreate(SurfaceHolder surfaceHolder) {

super.onCreate(surfaceHolder);

//可以设置点击事件

setTouchEventsEnabled(true);

}

@Override

public void onSurfaceCreated(SurfaceHolder holder) {

//把视频输出到SurfaceHolder上面

if (mp != null && mp.isPlaying())

return;

//可以设置SD卡的视频

mp = MediaPlayer.create(getApplicationContext(), R.raw.bird);

//这句话并不简单

mp.setSurface(holder.getSurface());

//重复播放

mp.setLooping(true);

mp.start();

}

//当桌面不可见的时候的处理

@Override

public void onVisibilityChanged(boolean visible) {

if (visible) {

if (mp != null)

return;

mp = MediaPlayer.create(getApplicationContext(), R.raw.bird);

mp.setSurface(getSurfaceHolder().getSurface());

mp.setLooping(true);

//获取进度播放

mp.seekTo(progress);

mp.start();

} else {

if (mp != null && mp.isPlaying()) {

//保存进度

progress = mp.getCurrentPosition();

mp.stop();

mp.release();

mp = null;

}

}

}

@Override

public void onDestroy() {

if (mp != null) {

mp.stop();

mp.release();

}

super.onDestroy();

}

}

}

上面的代码并不复杂,只是自己做的时候会遇到一些问题,首在不能在Engine的onCreate的方法里面设置视频播放,应该是SurfaceHolder还没有创建吧,还有mediaPlayer设置输出的Surface

//正确设置代码

mediaPlayer.setSurface(holder.getSurface());

//一般是这样设置,这里这样设置报错

mediaPlayer.setDisplay(holder);

是Service那肯定要注册的

android:name="ui.service.VideoWallpaper"

android:permission="android.permission.BIND_WALLPAPER">

android:name="android.service.wallpaper"

android:resource="@xml/livewallpapervideo" />

然后关于"livewallpapervideo.xml",就是一个正常的布局文件

android:settingsActivity="ui.activity.LiveWallPreference"

android:thumbnail="@mipmap/ic_video"

android:description="@string/wallpaper_description4"

/>

里面有个settingsActivity,这个东西我不知道有什么用,就是随便一个Activity,你也要注册这个Activity,

其他玩法

除了将视频作为壁纸以为还可以将GIF作为壁纸,将摄像头获取到的图象作为壁纸,甚至直接自己在SurfaceHolder自己画东西都可以,道理都是一样的

服务器挂了,可以看看本地壁纸

android经典动态壁纸,Android动态壁纸解析相关推荐

  1. Android 经典 Crash 分析,Android Crash 原理分析

    android 中最重要的就是 Handler 机制了,简单来说 Handler 机制就是在一个死循环内部不断取走阻塞队列头部的 Message,这个阻塞队列在主线程中是唯一的,当没有 Message ...

  2. Android经典蓝牙开发全流程

    一.基本介绍   所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,最初是由爱立信公司公司发明的.技术始于爱立信公司 1994 方案,它是研究在移动电话和其他配件间进行低功耗.低成本无 ...

  3. Android中对静态壁纸和动态壁纸原理深入理解

    本章主要内容: 讨论动态壁纸的实现. 在动态壁纸的基础上讨论静态壁纸的实现. 讨论WMS对壁纸窗口所做的特殊处理. 本章涉及的源代码文件名及位置: WallpaperManagerService.ja ...

  4. Android动态桌面,设置壁纸篇

    最近要做一个动态桌面.就看了下动态桌面有关的东西. 1,通过WallpaperManager设置静态壁纸 1.1先通过以下方法获取到WallpaperManager 1.2这个WallpaperMan ...

  5. android 动态label,Android仿抖音实现动态壁纸

    一.概述: 壁纸运行在一个Android服务之中,这个服务的名字叫做WallpaperService.当用户选择了一个壁纸之后,此壁纸所对应的WallpaperService便会启动并开始进行壁纸的绘 ...

  6. Android静态壁纸和动态壁纸的使用和理解

    这两天在公众号上偶然看到一篇关于设置动态壁纸的文章,觉得蛮有意思的,学习了一下,以此文章记录一下怎样给手机设置静态壁纸和动态壁纸,设置壁纸的使用方法. 静态壁纸 Android中WallpaperMa ...

  7. android4.1动态壁纸,Android 4.1 设置默认开机动态壁纸

    需要修改的文件为: 找到SourceCode/framework/base/core/res/res/values/config.xml中的: @null 包名/动态壁纸服务名 比如将默认壁纸更改为& ...

  8. android默认没有动态壁纸,安卓动态壁纸用不了怎么办 解决动态壁纸设置不了方法...

    广大适用安卓手机的小伙伴们,对于壁纸一直有较高的要求.很多洋气的用户还用上了动态壁纸,但是最近有一波用户发现,动态壁纸用不起来了,天哪,自己的手机再也不是原来的样子了,那么安卓动态壁纸用不了怎么办?下 ...

  9. android视频动态壁纸app,动态壁纸视频桌面

    动态壁纸视频桌面app,手机动态壁纸大全,为你带来多种类型壁纸资源,适用于学生.情侣.家人.闺蜜等人群,使用简单,内容丰富,轻松搞定你的手机桌面. 软件介绍 动态壁纸视频桌面:是集视频动态壁纸.3D壁 ...

  10. Android使用WallpaperService和openGL ES生成的动态图形设置动态壁纸

    针对使用WallpaperService和openGL ES得到的动态图形设置动态壁纸的说明 1.首先创建一个MyselfWallpaperService类继承于WallpaperService类.在 ...

最新文章

  1. 20150110--魔术方法魔术常量+面向对象-02
  2. linux如何利用命令保存文件,如何在Linux中将命令输出保存到文件?
  3. CSS选择器:伪类(图文详解)
  4. openssh漏洞_技术干货 | OpenSSH命令注入漏洞复现(CVE202015778)
  5. python如何存储numpy数组_python – 如何将numpy数组作为对象存储在pandas数据框中?...
  6. 移动开发者走向全能开发者的五大技能
  7. npm安装模块版本符_Java SE 9:模块和模块描述符基础知识(第2部分)
  8. 我亦云云——也谈云计算(3)
  9. Django+Bootstrap+Mysql 搭建个人博客(一)
  10. 深入理解和使用nginx
  11. jsp实现简单购物车页面
  12. 最新版ins安装包下载
  13. wow服务器人口普查哪个网站,魔兽世界wow官方的人口普查在哪里查询_魔兽世界wow人口普查数据到底是多少_快吧游戏...
  14. 用计算机怎么安装新思路软件,新思路计算机二级
  15. 账单---Grid++Report报表设计器
  16. promise和async用法及区别(详解)
  17. oracle中 sql%rowcount 用法
  18. 国外top10的aPaaS平台
  19. “跳槽啦”一个广告菜鸟的自白
  20. 只需1个操作,100M宽带变身500M,迅雷下载满速狂飙

热门文章

  1. 算法系列之二十三:离散傅立叶变换之音频播放与频谱显示
  2. 系统集成项目管理工程师有什么用?
  3. 从零开始学习OpenWrt完美教程
  4. 服务器系统2012u盘安装教程,windows2012 u盘安装教程
  5. 计算机毕业设计源码—Springboot驾校考试网站系统
  6. 雾芯科技,创新者的窘境
  7. 基于表面肌电信号的连续运动估计之前言(一)
  8. 《算法竞赛入门经典2th》 习题 2-4 子序列的和
  9. aliplayer 直播在微信和支付宝浏览器自动播放兼容
  10. 使用Intel NCS算力棒 安装部署记录 VirtualBox With Ubuntu16.04 Source Aliyun