手摸手教你做动态壁纸

Android · jeasonwong · 于 5 天前发布 · 最后由 xingstarx 于 2 天前回复 · 440 次阅读

项目地址:https://github.com/JeasonWong/SnowingView

分析

目前github上大部分的自定义动画都是继承View实现的,包括我自己,平时都直接用View解决,但是想做动态壁纸,就必须得熟悉用SurfaceView做动画,原因是实现动态壁纸,得继承WallpaperService,并且实现自己的Engine类,而Engine类的内部实现逻辑与SurfaceView类似。

先简单介绍下SurfaceView,SurfaceView可以避免画图任务繁重的时候造成主线程阻塞,因为它可以在主线程之外的线程中向屏幕上绘图,详细使用后面再说。

了解了需要什么技术后,还有一点很重要,那就是得充分利用github上现有的轮子,这篇文章我是fork了别人已经写好的一个View,然后改了个别地方,其余的都直接照搬过来,正如我前面所说,目前github上大部分动画都是直接用View实现的,所以要学会如何花少量的时间把View转成SurfaceView尤为重要了。

其实写任何自定义View无非就是以下几点:

  • 创建各种画笔
  • 初始化各种绘图需要使用的实体
  • 各种坐标计算/实体值变化
  • onDraw()画画画

基本star数量>100的项目对以上几方面都分类的比较清楚,改成SurfaceView也相应简单点,我们只需要找准关键的onDraw()的内容,然后ctrl+c ctrl+v就好了(当然自己心里要对该轮子有数,并不是star多的项目就是好代码。。。)

具体实现

继承WallpaperService并实现内部Engine

public class SnowingPaperService extends WallpaperService {@Overridepublic Engine onCreateEngine() {return new SnowingEngine();}public class SnowingEngine extends Engine implements SensorEventListener {...}}

重写onSurfaceChanged()

在直接使用SurfaceView的时候若想拿到View的宽高,可以从onMeasure()或者onSizeChanged()中拿到,而在WallpaperService里,可以从onSurfaceChanged中拿到,拿到后再做些需要宽高的一些初始化。

@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {super.onSurfaceChanged(holder, format, width, height);mWidth = width;mHeight = height;createSnowFlakes();
}

重写onVisibilityChanged()

这个和常见业务开发一样,当页面不展现时总想取消一些操作,比如网络请求亦或是其他操作,在动态壁纸里,取消的当然就是让动画动起来的轮询啦。

@Override
public void onVisibilityChanged(boolean visible) {super.onVisibilityChanged(visible);isVisible = visible;if (visible) {startFall();} else {stopFall();}
}

重写onSurfaceDestroyed()

在这里做些结束操作(如结束轮询)。

@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {super.onSurfaceDestroyed(holder);stopFall();
}

找准优秀轮子的onDraw()

当然还是更鼓励自己写出优秀的轮子。。

这里就是之前强调的绘制层。

private void draw() {Canvas canvas = null;try {canvas = mHolder.lockCanvas();if (canvas != null) {canvas.drawColor(Color.BLACK);//优秀轮子的onDraw()...}}finally{    if (canvas != null) {mHolder.unlockCanvasAndPost(canvas);}}
}

Java层的代码基本就是以上了。

接下来就是一些配置问题了。

AndroidManifest.xml

<serviceandroid:name="info.hellovass.snowingview.widgets.SnowingPaperService"android:label="@string/app_name"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/snowing_paper"/>
</service>

snowing_paper.xml

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

权限

<uses-permission android:name="android.permission.SET_WALLPAPER"/>

总结

动态壁纸的实现不难,但我觉得意义还是很大的,一是熟悉SurfaceView,二是能快速利用别人的优秀代码,三是这是目前Android独有的功能噢,iOS木有哈哈哈哈。我自己github上有一些直接用View写的轮子,欢迎大家fork下来改成动态壁纸哈~

参考文章

surfaceview刷新操作的一些优化建议

Android之SurfaceView使用总结

手摸手教你做动态壁纸相关推荐

  1. 【万字长文】手摸手教你shell脚本编程

    [万字长文]手摸手教你shell脚本编程 我写这篇文章的目的 前段时间参加了联创团队的春令营, 为期半个多月的春令营做了三个项目, 其中有一个项目是关于shell的, 当时完全没接触过shell脚本编 ...

  2. 手摸手,带你用vue撸后台 系列一(基础篇) - 掘金

    完整项目地址:vue-element-admin 系列文章: 手摸手,带你用 vue 撸后台 系列一(基础篇) 手摸手,带你用 vue 撸后台 系列二(登录权限篇) 手摸手,带你用 vue 撸后台 系 ...

  3. IN-我的生活in记 | 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告. 引言 IN是一款基于女性和品牌的时尚品位分享移动端社区,以图片社 ...

  4. vue 前端显示图片加token_手摸手,带你用vue撸后台 系列二(登录权限篇)

    完整项目地址:vue-element-admin https://github.com/PanJiaChen/vue-element-admin 前言 拖更有点严重,过了半个月才写了第二篇教程.无奈自 ...

  5. 微信小程序开发❤手摸手撸小程序一篇就够!

    手摸手撸小程序!!超简单,一篇就够! 微信小程序介绍 微信小程序,简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用 ...

  6. 快应用之手摸手,跟我走(1)

    快应用发布快两周啦.这两天有空,就捣鼓了一个快应用.整体感觉来说,交互很流畅,基本功能和组件都有.上手也很快.希望官网推广能做好.好了,话不多说,先上 gitHub (传送门) gankQuick-快 ...

  7. 招聘行业颠覆者【伯小乐】| 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告. 作者微信:weihe2416 "伯小乐" 是 ...

  8. 短视频Gif快手-有点意思 | 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告.                                 ...

  9. 玩美自由行体验报告 | 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告. 个人微信:Hm_VS_Zyf 玩美自由行app是一款在线境外旅行 ...

最新文章

  1. 公开课 | 微信高级研究员解析深度学习在NLP中的发展和应用
  2. javascript 通过键获取值
  3. 微服务测试之静态代码扫描
  4. restful api_将Spring MVC RESTful Web服务迁移到Spring 4
  5. 【直播课】6小时教你掌握MMdetection工程落地实践
  6. pygame学习和python巩固——字体显示
  7. 编辑器扩展_关于MediaWiki的编辑器
  8. 美国无人机在火星首飞成功,创造历史,3米飞行高度悬停30秒
  9. 选择更安全的方式执行你的puppet更新
  10. vue获取div中的值_一篇文章看懂Vue.js的11种传值通信方式
  11. 解密阿里云高效病原体基因检测工具
  12. 数据结构严蔚敏 #二叉树 代码复现
  13. Vivado的安装以及使用_入门
  14. \t\t产后饮食标准 饮食原则 最适合新妈妈吃的菜 饮食秘诀 禁忌
  15. android登录界面素材,2014年国外30个精美APP登录界面UI设计欣赏
  16. 全排列、排列组合(去重区别)
  17. python读txt文件-python读取文本文件数据
  18. IDEA设置按键提示 Ctrl+p
  19. 基于TI 335X的工业网关参考设计
  20. linux 下遍历文件夹下的所有文件

热门文章

  1. 如何用c输出我的名字
  2. 大班运用计算机教学案例,幼儿园大班音乐教学方案实用案例5篇
  3. MySQL数据类型之数值数据类型
  4. 利用前端form表单的上传文件来发送邮箱附件
  5. flask获取post请求参数
  6. python当前时间加一分钟,在python中向时间戳添加分钟
  7. Linux之父:连你自己都懒得解释,那这就是一堆垃圾!
  8. 马化腾三年前推出的微信公众号付费功能,终于来了
  9. decode的mysql用法_oracle中decode函数的使用方法示例
  10. Linux 编译安装Nginx