android经典动态壁纸,Android动态壁纸解析
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动态壁纸解析相关推荐
- Android 经典 Crash 分析,Android Crash 原理分析
android 中最重要的就是 Handler 机制了,简单来说 Handler 机制就是在一个死循环内部不断取走阻塞队列头部的 Message,这个阻塞队列在主线程中是唯一的,当没有 Message ...
- Android经典蓝牙开发全流程
一.基本介绍 所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,最初是由爱立信公司公司发明的.技术始于爱立信公司 1994 方案,它是研究在移动电话和其他配件间进行低功耗.低成本无 ...
- Android中对静态壁纸和动态壁纸原理深入理解
本章主要内容: 讨论动态壁纸的实现. 在动态壁纸的基础上讨论静态壁纸的实现. 讨论WMS对壁纸窗口所做的特殊处理. 本章涉及的源代码文件名及位置: WallpaperManagerService.ja ...
- Android动态桌面,设置壁纸篇
最近要做一个动态桌面.就看了下动态桌面有关的东西. 1,通过WallpaperManager设置静态壁纸 1.1先通过以下方法获取到WallpaperManager 1.2这个WallpaperMan ...
- android 动态label,Android仿抖音实现动态壁纸
一.概述: 壁纸运行在一个Android服务之中,这个服务的名字叫做WallpaperService.当用户选择了一个壁纸之后,此壁纸所对应的WallpaperService便会启动并开始进行壁纸的绘 ...
- Android静态壁纸和动态壁纸的使用和理解
这两天在公众号上偶然看到一篇关于设置动态壁纸的文章,觉得蛮有意思的,学习了一下,以此文章记录一下怎样给手机设置静态壁纸和动态壁纸,设置壁纸的使用方法. 静态壁纸 Android中WallpaperMa ...
- android4.1动态壁纸,Android 4.1 设置默认开机动态壁纸
需要修改的文件为: 找到SourceCode/framework/base/core/res/res/values/config.xml中的: @null 包名/动态壁纸服务名 比如将默认壁纸更改为& ...
- android默认没有动态壁纸,安卓动态壁纸用不了怎么办 解决动态壁纸设置不了方法...
广大适用安卓手机的小伙伴们,对于壁纸一直有较高的要求.很多洋气的用户还用上了动态壁纸,但是最近有一波用户发现,动态壁纸用不起来了,天哪,自己的手机再也不是原来的样子了,那么安卓动态壁纸用不了怎么办?下 ...
- android视频动态壁纸app,动态壁纸视频桌面
动态壁纸视频桌面app,手机动态壁纸大全,为你带来多种类型壁纸资源,适用于学生.情侣.家人.闺蜜等人群,使用简单,内容丰富,轻松搞定你的手机桌面. 软件介绍 动态壁纸视频桌面:是集视频动态壁纸.3D壁 ...
- Android使用WallpaperService和openGL ES生成的动态图形设置动态壁纸
针对使用WallpaperService和openGL ES得到的动态图形设置动态壁纸的说明 1.首先创建一个MyselfWallpaperService类继承于WallpaperService类.在 ...
最新文章
- 20150110--魔术方法魔术常量+面向对象-02
- linux如何利用命令保存文件,如何在Linux中将命令输出保存到文件?
- CSS选择器:伪类(图文详解)
- openssh漏洞_技术干货 | OpenSSH命令注入漏洞复现(CVE202015778)
- python如何存储numpy数组_python – 如何将numpy数组作为对象存储在pandas数据框中?...
- 移动开发者走向全能开发者的五大技能
- npm安装模块版本符_Java SE 9:模块和模块描述符基础知识(第2部分)
- 我亦云云——也谈云计算(3)
- Django+Bootstrap+Mysql 搭建个人博客(一)
- 深入理解和使用nginx
- jsp实现简单购物车页面
- 最新版ins安装包下载
- wow服务器人口普查哪个网站,魔兽世界wow官方的人口普查在哪里查询_魔兽世界wow人口普查数据到底是多少_快吧游戏...
- 用计算机怎么安装新思路软件,新思路计算机二级
- 账单---Grid++Report报表设计器
- promise和async用法及区别(详解)
- oracle中 sql%rowcount 用法
- 国外top10的aPaaS平台
- “跳槽啦”一个广告菜鸟的自白
- 只需1个操作,100M宽带变身500M,迅雷下载满速狂飙