Skip to content

MaskWallpaper,由一张壁纸引发的 Flutter 项目

  • 我是 Marno,梦想成为一个有 ⌞百万用户⌝ 的独立开发者。
  • 关注公众号【 Marno 】,和我一起踏上百万用户成长之旅。
  • 本文为 Marno 原创,转载请获取授权。

🧐 真由壁纸而起?

壁纸重要吗?重要!我觉得换个壁纸,甚至都能影响心情。你觉得呢?

平时不喜欢折腾手机主题,就喜欢偶尔换换壁纸,但又不喜欢那种自动定时换壁纸的感觉,而是最好在手机某个地方点击一下就随机换一张。

秉着先看看网上有没有的想法,搜索一番,还真让我在酷安上发现一个项目,是由 gddhy 开发的《随机壁纸App》。用了一下,算是比较对胃口了。

功能简单直接到极致,安装包居然也只有 36K,没有乱七八糟的界面,就是设置好壁纸目录,然后桌面上的图标点击一下就可以换一张壁纸。虽然还不能满足我的所有需求(后面解释),但也基本满足了我 70% 需求了。

直到我把手机从魅族换成了 vivo 以后,随机壁纸点击一下会同时把手机桌面和锁屏的壁纸同时换了,天塌了。锁屏壁纸是我好不容易设置好的景深壁纸啊,我只想换桌面壁纸啊。

于是,抱着侥幸的心理,想搜一下万一作者开源了代码,我自己改下就好了,众所周知,安卓设置壁纸就是靠以下方法,通过一个 type 参数就能控制壁纸的应用范围了。

kotlin
// 设置壁纸, 最后的 type 表示壁纸生效类型
wallpaperManager.setBitmap(bitmap, null, true, type)

不过很可惜,作者并没有开源。然后我就继续搜有没有类似的软件,还真被我在酷安上找到一个二改随机壁纸的,还以为看到了曙光,可没曾想,下载链接挂掉了。

我以为能二改,是不是作者没有混淆代码?毕竟只是个 Side Project,没混淆也很合理,可作者的开发习惯太好了,尽管 App 连个正儿八经的图标都没有(OS:强迫症表示很难受),也还是加了代码混淆。哈哈哈~,虽然反编译了应该也能研究一下,但属实没必要了,对那方面也不是很感兴趣。

于是乎,和所有“用不惯就自己搞”的开发者一样,我也自己写了一个。

最开始想的是这应该也没多少工作量,加上有 AI 的帮助,我可能都写不了几行代码。

但是,写着写着,“开发瘾” 又犯了。脑袋里就有个声音:写都写了,写好点呗。

🤓 好吧,那开写!

既然有了这个想法,那除了基本的随机切换壁纸的功能以外,还有之前说的【随机壁纸App】中没能满足的 30% 的需求,也由我自己来补上吧。大概有以下几点吧:

  1. 分开换桌面和锁屏的壁纸: 所以,至少得有3个按钮:换桌面、换锁屏、换全部
  2. 壁纸目录分开设置: 因为很多壁纸适合桌面不一定适合锁屏,反之亦然。
  3. 不喜欢该壁纸: 换壁纸的时候,遇到不喜欢的,可以标记为不喜欢,然后再也不会出现。
  4. 添加壁纸装饰: 换壁纸的时候也不会消失。比如给 dock 设置个背景;比如给图标设置个分隔啥的。
  5. 随机创造壁纸: 需求不高,捎带手的那种,有没有都行吧。

带着以上的目标,马上就投入到了开发中。

但是,写着写着,“Flutter瘾” 又犯了,想着与其用那已经忘的差不多了的 Kotlin 写,不如试试用 Flutter 写?

但是 Flutter 能写得了这种类型的业务吗? 毕竟这个项目的底层逻辑基本都在 Native 端,而且一级业务交互的入口是在桌面插件上。如果用 Flutter 开发的话,和桌面插件交互会不会很麻烦呢?

说实话,虽然 Flutter 写了好多年,但还一直没有遇到需要做桌面小组件的项目。所以本着:【不用就不学,学了不用也会忘】的思想理念,还从未深入了解过 Flutter 在实现桌面小组件这方面的能力如何。

结果大家应该也知道了,既然现在你能看到我在这里叭叭的写,说明那个男人他已经写完了。

所以,Flutter, 他可以(高呼破音)!

这里要特别提一下 home_widget 这个库,一个可以在 flutter 端实现和桌面小组件进行交互的插件。不过项目写完以后,发现我可能只发挥了这个库 30% 的功能。它提供了一个很 Hack 的思路,可以在 flutter 端控制桌面小组件的 UI,就是通过RepaintBoundary 把 flutter 组件截图以后发送给小组件进行展示。虽然这样做的限制性很大,但是对于某些场景还是够用的。另外如果搭配 workmanager 一起使用,还能执行一些后台任务。感兴趣的可以参考 home_widgetexample 中的代码。

😎 他来了~他来了~他带着 MaskWallpaper 走来了

这个名字怎么来呢?额...是豆包帮我取的。本来我想蹭一下李跳跳的大名的,叫个李换换啥的,但又怕被人喷我蹭流量~

0. Logo 和 Icon

之前我每个独立项目的 Logo,比如:《Readhub+》《EyeSaver》《iSearchBar》等,都是用 PPT 画的。所以,这次也不例外。PS: 其实 PPT 是很好的画图工具,真的!

我都觉得我可以单独写一篇文章来介绍 《程序员如何使用 PPT 给 App 做 Logo 》 了(瞧瞧~,这不是连文章标题都有了?)。不知道有没有人想看的?也不知道够不够攒一篇文章出来。

这次 Logo 的设计,其实就是取了 Mask Wallpaper 的首字母 MW 组合了一下。

1. 初始化

首次启动 MaskWallpaper,按照引导页面的提示,完成对软件的初始化以后。我们就可以愉快的切换壁纸了。

如果你点击 MaskWallpaper 后无法更换壁纸,请务必确保所需权限都已授权! 因为某些机型上设置壁纸的权限即便代码里面获取完成了,但打开设置一看权限还是禁止的。

我就不费功夫研究原因了。总之,如果用不了,大概率是权限的问题导致的,要么是没给存储权限导致拿不到壁纸文件,要么是限制了频繁启动,要么就是禁止了设置壁纸。

2. 创建 Mask

3. 编辑 Msak,添加装饰

什么是 Mask?为什么需要它?

如果你只是希望换个壁纸,那你也许根本用不到它。换句话说就是,你不创建 Wallpaper Decoration 也完全不影响你通过桌面组件随机更换壁纸,也就是和【随机壁纸App】一样的功能。

但是如果你希望自己的壁纸看起来不那么单调,希望能给它添加一些装饰,那么 Mask 就派上用场了。它不需要通过在桌面创建小组件来装饰壁纸,而是直接把“小组件”合成到壁纸上了,简而言之就像是在 PhotoShop 中把两个图层合并那样。而且技术上的实现也正是如此。

用过 KWGT Kustom 的人,可能会觉得,这个设置属性的界面怎么这么眼熟呢?

这是致敬 🫡,Salute!

4. 应用 Mask

当你创建好 Mask 以后,你可以将他设置为桌面的模板,或者锁屏的模板,然后在下次切换壁纸的时候,这些模板就会和随机到的壁纸进行合并后,在设置到对应的位置。

如果你需要取消 Mask,只需要再次点击相同的位置,就可以取消应用到桌面或锁屏了。

5. 如何更换壁纸

Mask Wallpaper 提供了 3 种更换壁纸的方式,分别是:桌面小组件,Shortcuts,通知中心图标

by-widget.webpby-shortcuts.webpby-notification-tile.webp

为了适配不同桌面主题的样式,我给小组件添加了设置样式的功能。你可以将它们调整成比较接近你桌面图标的样式,但受限于不同定制化Android系统的影响,可能某些属性的调节效果会不太尽如人意 ,只能说是尽量接近,无法做到 100% 相同。这一点,开发过小组件的人应该都有体会。

🥳 DaDa~ 壁纸变了

终于,又可以愉快的换壁纸了!就是那种点击一下,就换一张壁纸的感觉。我的开心终于又回来了。

除了可以随机换壁纸以外,如果搭配上壁纸装饰(Wallpaper Decoration),我还想到一些比较实用的的用法。

  • 给屏幕的挖孔增加装饰
  • 给锁屏的指纹、相机、手电筒等图标增加背景
  • 给桌面图标增加风格背景图,像上面示例那种
  • 给图标增加分区说明背景
  • 给 dock 栏增加背景
  • 个性化的锁屏收款二维码

总之我觉得 Mask Wallpaper 应该还有更多好玩有趣的用法,就等着这届强大的网友们来发掘了。

在创作的过程中,难免会用到一些图片资源,顺便推荐几个比较好用的资源网站:

🎨 纯人工非智能,壁纸生成器

另外,顺手做了几种不同风格的壁纸生成器,没有接入 AI,就是纯代码实现的,就当是图一乐吧。你要说生成的壁纸多好看,倒也不至于,但独一无二倒是可能的。下面就是我用 Mask Wallpaper 生成的一些壁纸,应该还是将就能看上一看吧。

壁纸1壁纸2壁纸3

目前一共有以下 5 种风格的壁纸生成器,除了可以随机生成以外,每一种都可以手动调节参数。

1. 混色壁纸生成器

Generator

2. 表情壁纸生成器

Emoji GeneratorManual Config

3. 斑点壁纸生成器

GeneratorManual Config

4. 渐变色壁纸生成器

GeneratorManual Settings

5. 网格壁纸生成器

GeneratorManual Config

🔔 最后的最后

MaskWallpaper 是我在业余时间开发的一个 App,它不仅完全免费,而且也不包含任何广告。虽然是免费的 App,但我也依然倾注了大量的心血。因为对于我个人而言,我不仅喜欢想法变成现实的这个开发过程,也喜欢在这个过程中自己对产品逻辑和 UI 交互上进行不断思考的那种感觉(业内俗称 《打磨😎》 )。

当然,如果你对 MaskWallpaper 也有一些不错的建议,也可以告诉我,我会考虑采纳,不断优化这个 App。

1. 如何下载?

目前可以通过 Google Play 进行下载,因为上架国内市场现在需要的手续比较多,还在办理中,估计再有60天左右就能上架国内了(无奈摊手.jpg)。

如果你也喜欢这个项目,方便的话,还请在 Google Play 上给它一个 5 星好评

>>> 去 Google Play 下载 MaskWallpaper

2. 投个免费的票吧~

现在 MaskWallpaper 也在 ProductHunt 上开启了投票。不求其他,还请大家投个免费的票支持一下,非常感谢!

>>> 去 ProductHunt 投票支持 MaskWallpaper

好了,至此,由一张壁纸引发的项目,结项!

  • 我是 Marno,梦想成为一个有 ⌞百万用户⌝ 的独立开发者。
  • 关注公众号【 Marno 】,和我一起踏上百万用户成长之旅。
  • 本文为 Marno 原创,转载请获取授权。