查看原文
其他

Android 仿火萤视频桌面 神奇的LiveWallPaper

鸿洋 鸿洋 2019-04-05

好久没写文章了,这几周应该都会写文章~~感谢大家长期的支持~


注:本文的测试机为小米5s ,可能不同手机会有一些兼容性问题,尝试解决下。


1
概述


上周我推送了一篇Android 实现"透明屏幕",当时我看到之后就觉得特别感兴趣,也立即联系作者要了授权~~


感兴趣的原因是,我是内涵段子的资深用户,前段时间基本被一款叫火萤视频桌面的软件(就是将视频作为桌面)给刷屏了,所以看了下作者的代码,看到了SurfaceHolder,立刻想到了,肯定可以用来播放视频实现视频桌面的效果,于是周末尝试了下,果然很简单。


所以本篇文章无限感谢Android 实现"透明屏幕"一文,代码也部分参考自其提供的透明相机。


  • https://github.com/songixan/Wallpaper


效果图是这样的:



2
实现


(1) 配置相关


首先编写一个xml文件,用于描述wallpaper的thumbnail、description、settingsActivity等,这里为了简单,仅设置了thumbnail。


<?xml version="1.0" encoding="utf-8"?> <wallpaper xmlns:android="http://schemas.android.com/apk/res/android"    android:thumbnail="@mipmap/ic_launcher" />


(2)编写代码


Wallpaper需要在屏幕上一直显示,其背后其实是一个Service,所以实现一个Wallpaper需要继承自`WallpaperService`,实现其抽象方法`onCreateEngine`,如下:



可以看到返回值是一个Engine,Engine为WallpaperService的内部类,其内部包含`onSurfaceCreated`、`onSurfaceChanged`、`onSurfaceDestroyed`、`onTouchEvent`等方法,看到这些方法,立刻想到了SurfaceView,关于SurfaceView相关知识可以参考:


  • [Android SurfaceView实战 打造抽奖转盘](http://blog.csdn.net/lmj623565791/article/details/41722441)


此外,大家还记得在Android播放视频吗?


常规的做法有通过VideoView,除此以外还有通过MediaPlayer配合SurfaceView配合来实现,今天这个例子类似后者。


我们只需要通过MediaPlayer将解码的数据不断的输送到传入的Surface中即可。



代码非常简单,在onSurfaceCreated中去初始化mMediaPlayer,核心代码即为设置setSurface方法,这里我默认设置了静音。


onVisibilityChanged,即当桌面不可见时,我们要暂停播放,等回到桌面继续。


当onSurfaceDestroyed时释放资源~~


这样我们的VideoLiveWallpaper就写好了,别忘了他是个Service,需要我们去注册。



(3)设置为壁纸


注册完成后,我们在MainActivity中添加一个按钮点击设置为桌面背景,调用代码如下



这样就完成了代码的初步编写啦~~


(4)增加一些参数的支持


刚才我们设置了默认是静音,可能有时候我们会希望能够动态去控制视频桌面的参数,正常应该尝试去使用`settingsActivity `,不过我觉得其实广播也挺合适的,无非就是Service(可能在独立的进程)和Activity等通信嘛~~


这里我们增加一个复选框,支持设置开启声音or关闭声音。



Engine还有onCreate和onDestroy声明周期方法,可以在onCreate中注册动态广播,当接受到发送的action为`ACTION_VOICE_NORMAL `则开启声音;接收到发送的`ACTION_VOICE_SILENCE `则为静音状态。


最后直接在VideoLiveWallpaper中添加两个静态方法用于发送广播即可:



在Actiivty中:



监听一下CheckBox状态,发送广播即可。


ok,这样一个简单的视频桌面就完成啦~~


源码地址: https://github.com/WanAndroid/LiveWallPaper/tree/master/hongyang/MagicWallPaper


直接将这个目录以项目形式导入。


3
总结


其实在Android 实现"透明屏幕"推送之后,后台存有一些负面的留言,可能觉得文章没有用处~


可能这里对没有用处的理解是“我项目中用不到”、“这玩意没有实际意义”,其实

我个人关注一个知识点,我会更加喜欢关注我从未用过的东西,比如WallPaper这个,除了在初学的时候在课本上见过以外,再也没用过,没想到还能这么玩;再者我会考虑这个东西还能做什么,是不是可以扩展一下,做个别的什么的玩意~


“这玩意没有实际意义”这个想法,怎么说呢,咱们程序员很多时候都非常实在,从自身去看很多东西都没有实际意义,这玩意我打死也不会装手机上使用,谁会放个视频做壁纸呀。


但是实际上,一个类似功能app自从推出之后,传播速度非常快,下载量也比较可观,自然会带来一定的收入。所以,偶尔接触一些奇怪的东西,如果其有自然传播能力,可以尝试做个app投放到市场试试,或许有一些收获呢~~


对了,这个项目实际上也是我的一个测试的项目,我准备做这样一件事,发起一个项目,然后让有兴趣的人加入进来,大家都在一个github仓库中以自己文件夹为单位进行提交代码。



比如本项目就有4个人参与,很开心目前有3个人都完成了该项目代码的提交。大家有什么想做的可以留言,后面我会将有相同兴趣的大家拉到一起,这样大家都在学习感兴趣的东西,且能互相参考,当然这是个纯靠自觉的仅用于学习的项目。


好了,如果有收获可以赞赏一下,感谢~~

ZZS

无论你是有 Java 基础希望学 Android 开发的程序员,还是想进一步提升能力的 Android 开发者,都可以在这个Udacity & Google 官方参与制作 的课程项目中找到适合自己的成长路径!



*独家硅谷技术课程

*行业领导者设计的实战项目

*一对一学习辅导

*名企颁发学习认证

*毕业直达滴滴面试


如果你有想学习的文章直接留言,我会整理征稿。如果你有好的文章想和大家分享欢迎投稿,直接向我投递文章链接即可。


欢迎长按下图->识别图中二维码或者扫一扫关注我的公众号:

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存