原标题:这次要把抖音网红文字时钟设置为壁纸了~

本文作者

作者:二娃_

https://juejin.im/post/5d52aea86fb9a06ae61aad5b

还记得上篇吗?我们先实现了抖音网红文字时钟的自定义 View 实现:

抖音上炫酷的网红文字时钟

1

概述

源码地址

https://github.com/drawf/SourceSet/blob/master/app/src/main/java/me/erwa/sourceset/view/TextClockWallpaperService.kt

2

起源

填坑啦!填坑啦!

其实关于「设置动态壁纸的实操」我是弃坑了的,因为我单方面觉得只是壁纸相关API的使用,价值不大。但不久前有「掘友」留言说及这事,并表示期待更新「下篇」,于是我又单方面觉得价值还是有的,能帮一个是一个。

目录

以下是我列的本篇目录,将按顺序依次做解说

如何快速上手设置壁纸?

相关API说明

文字时钟动态壁纸实践

如何快速上手设置壁纸?

NOTE: 这里暂时不关心「为什么」,我们只按照既定的步骤,快速上手实现一个「Hong Kong is part of China!」静态壁纸

1. 在res -> xml目录下新建一个壁纸描述文件,名字可自取(text_colck_wallpaper.xml),内容很简单

2. 继承WallpaperService在内部处理我们自己的绘制。(可以关注下onVisibilityChanged方法)

classTextClockWallpaperService: WallpaperService{

overridefunonCreateEngine: Engine {

returnMyEngine

}

inner classMyEngine: Engine{

/**

* 准备画笔

*/

privatevalmPaint = Paint.apply {

this.color = Color.RED

this.isAntiAlias = true

this.textSize = 60f

this.textAlign = Paint.Align.CENTER

}

/**

* Called to inform you of the wallpaper becoming visible or

* hidden. It is very important that a wallpaper only use

* CPU while it is visible..

*

* 当壁纸显示或隐藏时会回调该方法。

* 很重要的一点是,要只在壁纸显示的时候做绘制操作(占用CPU)。

*/

overridefunonVisibilityChanged(visible: Boolean){

super.onVisibilityChanged(visible)

Log.d( "clock", "onVisibilityChanged >>> $visible")

//只在壁纸显示的做绘制操作,这很重要!

if(visible) {

surfaceHolder.lockCanvas?.let { canvas ->

//将原点移动到画布中心

canvas.save

canvas.translate((canvas.width / 2).toFloat, (canvas.height / 2).toFloat)

//绘制文字

canvas.drawText( "Hong Kong is part of China!", 0f, 0f, mPaint)

canvas.restore

surfaceHolder.unlockCanvasAndPost(canvas)

}

}

}

}

}

3. 在AndroidManifest.xml文件中增加壁纸服务的声明

android:name=".view.TextClockWallpaperService"

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

android:name="android.service.wallpaper"

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

4. 增加启动壁纸设置服务的方法

btnSet.setOnClickListener {

val intent = Intent.apply {

action = WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER

putExtra(

WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,

ComponentName(

context,

TextClockWallpaperService:: class.java

)

)

}

startActivity(intent)

}

经过前面四步,我们成功的爱了一把国,效果如图:

3

相关API说明

壁纸描述文件

首先,这个描述文件是必须的,在声明服务的时候必须在meta-data上配置上。知道为什么吗?

1. 这个描述文件中有三个可选属性deion(对壁纸服务的描述) settingsActivity(对此壁纸进行参数设置的Activity) thumbnail(壁纸服务缩略图)

//示例代码

android:deion="@string/deion"

android:settingsActivity="me.erwa.xxx.SettingsActivity"

android:thumbnail="@mipmap/ic_launcher">

2. 通过源码可知,在壁纸服务启动之前会进行三个检查,其中第三个检查就是对meta-data中提供关于壁纸的描写叙述信息的检查用以创建一个叫WallpaperInfo的实例。(关于原理部分解析,我在拜读的文章中贴出了链接,大家可自行食用)

壁纸服务的声明

其中必须要加的是:

1. 权限:android:permission="android.permission.BIND_WALLPAPER"

2. 处理Service的Action:

对!这两个也分别对应壁纸服务启动前的第一个检查和第二个检查

壁纸服务的实现

1. 继承WallpaperService并复写抽象方法public abstract Engine onCreateEngine;

/**

* 必须实现并返回一个壁纸引擎的新实例。

* 注意同一时间可能有多个实例在运行,比如当前壁纸正在运行时,用户在挑选壁纸页面浏览该壁纸的预览画面。

*/

publicabstractEngine onCreateEngine();

/**

* 壁纸的实际实现。一个壁纸服务可能有多个实例在运行(例如一个是真实的壁纸和一个处于预览的壁纸),

* 每个壁纸都只能由其相应的引擎实例来做实现。

* 你必须实现{@link WallpaperService#onCreateEngine}并返回你创建的引擎的实例。

*/

publicclassEngine{

...省略代码

}

2. Engine的关键生命周期,它们是从上到下依次执行的。我们重点关注onVisibilityChanged onSurfaceDestroyed即可。

inner classMyEngine: Engine{

overridefunonCreate(surfaceHolder: SurfaceHolder?){

super.onCreate(surfaceHolder)

Log.d( "clock", "onCreate")

}

overridefunonSurfaceCreated(holder: SurfaceHolder?){

super.onSurfaceCreated(holder)

Log.d( "clock", "onSurfaceCreated")

}

overridefunonSurfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int){

super.onSurfaceChanged(holder, format, width, height)

Log.d( "clock", "onSurfaceChanged")

}

/**

* Called to inform you of the wallpaper becoming visible or

* hidden. It is very important that a wallpaper only use

* CPU while it is visible..

*

* 当壁纸显示或隐藏是会回调该方法。

* 很重要的一点是,要只在壁纸显示的时候做绘制操作(占用CPU)。

*/

overridefunonVisibilityChanged(visible: Boolean){

super.onVisibilityChanged(visible)

Log.d( "clock", "onVisibilityChanged >>> $visible")

}

overridefunonSurfaceDestroyed(holder: SurfaceHolder?){

super.onSurfaceDestroyed(holder)

Log.d( "clock", "onSurfaceDestroyed")

}

overridefunonDestroy{

super.onDestroy

Log.d( "clock", "onDestroy")

}

}

3. 绘制相关的API

/**

* 提供对绘制壁纸时实际Surface(表面)的访问

*/

publicSurfaceHolder getSurfaceHolder{

returnmSurfaceHolder;

}

/**

* 开始在Surface上编辑像素。这个返回的画布可以用来在Surface的位图上绘制。如果Surface还没创建或者不能被编辑会返回null。

* 一般情况下,你需要通过实现{@link Callback#surfaceCreated Callback.surfaceCreated}这个方法,

* 来得知surface什么时候可用。

*

* Surface的内容在unlockCanvas和lockCanvas之间是不会保存的,因此,Surface区域必须写入每个像素。

* 这个规则有个例外就是指定一个特殊的脏矩形区域,这种情况下,非脏区域的像素才会被保存。

*

* 如果你在Surface创建前或销毁后重复调用该方法,为了避免占用CPU,你的调用将被限制为慢速率。

* 如果返回值不为null,该方法内部持有锁,直到相应的{@link #unlockCanvasAndPost}方法被调用,并会防止Surface

* 在绘制时被创建、销毁或修改。这样比直接访问Surface更方便,因为你不需要在{@link Callback#surfaceDestroyed

* Callback.surfaceDestroyed}和绘制线程中做特殊的同步。

* 返回一个用来绘制到Surface上的画布

*/

publicCanvas lockCanvas;

/**

* 完成Surface上像素的编辑。该方法调用完,Surface上的像素将会展示到屏幕上,但是它的内容会丢失,

* 尤其再次调用lockCanvas时也不能保证它的内容不会变动。

*

* 参数需传入之前lockCanvas返回的画布

*/

publicvoidunlockCanvasAndPost(Canvas canvas);

4

文字时钟动态壁纸实践

有了前面的铺垫,这部分就相对简单了。不过我们依旧先思考

抖音文字时钟壁纸html源码,这次要把抖音网红文字时钟设置为壁纸了~相关推荐

  1. [附源码]计算机毕业设计Node.js特色网红小吃网站(程序+LW)

    项目运行 环境配置: Node.js最新版+ Vscode + Mysql5.7 + HBuilderX+Navicat11+Vue. 项目技术: Express框架 + Node.js+ Vue 等 ...

  2. android浪漫樱花凋零动态壁纸应用源码

    android浪漫樱花凋零动态壁纸应用源码,是从那个安卓教程网拿过来的,本项目是一套基于安卓的樱花动态壁纸项目源码,安装以后桌面没有图标,但是可以在修改壁纸-动态壁纸中找到.我的分辨率是480×854 ...

  3. wpf 模拟抖音很火的罗盘时钟,附源码,解压就能跑

    wpf 模拟抖音很火的罗盘时钟,附源码,解压就能跑 前端时间突然发现,抖音火了个壁纸,就是黑底蕾丝~~~  错错错,黑底白字的罗盘时钟! 作为程序员的我,也觉得很新颖,所以想空了研究下,这不,空下来了 ...

  4. wpf 模拟抖音很火的罗盘时钟,附源码,下载就能跑

    wpf 模拟抖音很火的罗盘时钟,附源码 前端时间突然发现,抖音火了个壁纸,就是黑底蕾丝~~~  错错错,黑底白字的罗盘时钟! 作为程序员的我,也觉得很新颖,所以想空了研究下,这不,空下来了就用wpf, ...

  5. 抖音文字时钟壁纸html,网红文字时钟怎么弄 抖音网红文字时钟主题壁纸设置教程...

    类型:桌面主题大小:54KB语言:中文 评分:10.0 标签: 立即下载 最近很多小伙伴在抖音上看到了网红文字时钟主题壁纸,很有意思,自己也想要制作这种的,网红文字时钟怎么弄,西西小编为大家带来抖音网 ...

  6. 【自定义View】抖音网红文字时钟-上篇

    源码地址 抖音网红文字时钟-TextClockView 起源 周末在家刷抖音的时候看到了这款网红时钟,都是Android平台的,想来何不自己实现一把.看抖音里大家发的视频,这款时钟基本分两类,一类是展 ...

  7. 简洁优雅抖音在线qu水印HTML源码

    介绍: 简洁优雅抖音在线qu水印HTML源码,虽然简约,但不失优雅! 网盘下载地址: http://kekewangLuo.net/xKJM6gpwA8s 图片:

  8. 价值4500的国际版多语言点赞抖音分享点赞任务平台源码(十二种语言)

    介绍: 平台会员分享给我的,他自己搭建成功了,测试可用!我就不测试了,需要的拿! 九种语言 :西班牙语,泰语.日语,印度尼西亚语言.越南语言.英文.繁体中文,简体中文,印度语 前台支持更换5种颜色风格 ...

  9. php 记事本源代码_抖音无水印解析PHP源码

    抖音无水印解析PHP源码 仅限学习使用 输出为标准的格式化json数据 ajax直接调用即可 原生的ajax的调用方法看底部 $url = @$_GET['url']; if (strstr($url ...

最新文章

  1. Djkastra堆(手写堆)优化版
  2. 好程序员Web前端教程分享Vue学习心得
  3. 第八章 Python类中常用的特殊变量和方法
  4. BZOJ 1051 受欢迎的牛(Tarjan缩点)
  5. weblogic从入门到起飞!(域模块、扩展模块)(三)
  6. oracle调试死掉,oracle自动死掉了
  7. 给后辈的一点建议,分享PDF高清版
  8. 解决:Field xxMapper in xx.service.impl.xxServiceImpl required a bean of type ‘xx.mapper.xxMapper‘
  9. 创建线程的两种方式:继承Thread类和实现Runnable接口
  10. Diino - 具有自动数据备份功能的国外2G免费网络硬盘
  11. vue-cli 体验
  12. optisystem中bit rate等全局参数的意义
  13. git 2.15下载 git 2.18下载 windows 64位
  14. swagger ui 怎么输入对象_java swagger ui 添加header请求头参数的方法
  15. 自动杀死yarn 中运行的程序
  16. 关于工控安全什么是设备加密?
  17. 文献综述撰写格式及写作技巧
  18. [Hexo]Hexo+github搭建静态博客
  19. uni-app 系统打印、AirPrint、支持ipad、打印图片 pdf webView文档
  20. 三种合并请求的方式帮提高接口性能

热门文章

  1. 在字节跳动工作是怎样的?(蛮有意思)
  2. 从新手村出来,我在 Apache APISIX 社区发出了第一个 PR
  3. TOGAF之架构标准规范(一)
  4. 项目规划和方案设计文档的编写
  5. 一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目源码)
  6. 目标检测中NMS和mAP指标中的的IoU阈值和置信度阈值
  7. 中南大学计算机学院联系方式,中南大学
  8. 锂电池净化厂房低湿车间装修SICOLAB
  9. 使火狐浏览器默认在新的标签页打开书签
  10. AD14软件导入BRD不成功