迎接国庆,我上线了第一款小程序

最近花了些时间,写了一个 “国庆头像” 小程序。正好快国庆节了,于是分享一下我的这个 “Starstick星点贴纸” 小程序,顺便简单讲讲以及其中的设计、开发、上线过程。

小程序的界面是这样的:

🔮背景

今年中秋前夕,本来想着在中秋前写点什么来迎接节日,但是又考虑自己的技术水平可能在短短几天做不来什么,于是我想到了国庆节。到国庆节足有十几天时间,于是我不假思索地想到了一个 “国庆头像” 小程序,也许这个我能做出来。

“国庆头像” 小程序其实已经有很多了。不过我想只要做,就是一次练手机会,毕竟我刚学习小程序没几个月,再不上手估计全忘了…于是想法就确定下来了。

🚩立项

“国庆头像” 类小程序的名称几乎能有的都有了,跟 “国庆” “头像” 沾边的词汇估计会很容易冲突。主要因为这是个很细分的领域,于是我只能把立意扩大些。

首先 “国庆头像” 类小程序本质上就是 “贴纸” 或 “头像贴纸”,于是我选定了 “贴纸” 这个词;

接着是考虑加一些限定词,因为单是 “贴纸” 类小程序也很多。又因为 “国庆头像” 类小程序中总会有一面国旗,我想到了国旗中的星星,于是我就想出了一个 “星点”,项目名称就是 “星点贴纸”;

最后我又想着给起英文名,于是就有了 “Starstick”,由 “Star” 和 “Sticker” 简化拼接而来,最终就是 “Starstick星点贴纸”。

✏️设计

“Starstick星点贴纸” 的功能很简单,就只需一个页面就行,于是就只要围绕着更换贴纸作设计即可。除开一些 icon、字体和背景素材,logo、贴纸等都需要自行设计。

素材资料

  • pixabay.com,可以找到很多免费使用的图片素材作为背景
  • www.gov.cn,中华人民共和国国旗
  • iconfont.cn,可以提供免费使用的图标
  • zfont.cn,汇集了很多免费商业的字体

logo

围绕着 “星点” 设计,于是想象出了一个宇宙的星球,wink 出一点 “星”。

字体

围绕着 “星点” 为主题,设计了独特的具有辨识度的字体。

贴纸

贴纸主要是国庆、国旗相关的元素,也有一些其他跟 “国庆” 相关的元素。

icon

icon 部分分别设计了一个 “灯笼” 和 “五角星”。

界面

界面主要由 “背景图”,“头像预览框”,“贴纸区”,“功能按钮” 组成。

👨‍💻开发

功能需求

“Starstick星点贴纸” 的功能很简单,包含以下功能:

  1. 用户可选择本地图片
  2. 用户可选择贴纸并预览头像效果
  3. 用户可保存头像效果图片到手机相册
  4. 用户可分享小程序给好友

技术选型

开发语言:JavaScript

开发平台:微信小程序原生

服务器:🈚

数据库:🈚

开发实现

拍摄或从相册中选择图片

文档:https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html

位置:API / 媒体 / 视频 / wx.chooseMedia

首先用户需要从手机相册中选择图片或者拍摄照片来制作头像,

根据微信小程序提供的 API,调用wx.chooseMedia就可以实现 “拍摄或从相册中选择图片”。

接着在用户选择图片或拍摄之后,需要对图片手动进行 “1:1” 比例裁切,这里可以调用wx.cropImage,并指定裁切比例的参数cropScale: '1:1'

Page({// 从相册中选择selectFromAlbum() {wx.chooseMedia({count: 1,mediaType: ['image'],sourceType: ['album', 'camera'],success: (res) => {console.log(res);this.cropImage(res.tempFiles[0].tempFilePath);}});},// 按 1:1 裁切图片cropImage(src) {wx.cropImage({cropScale: '1:1',src: src,success: (res) => {console.log(res);this.setData({'preAvatar.avatar': res.tempFilePath,'preAvatar.isUserAvatar': true});}})},
});

Canvas 绘制

文档:https://developers.weixin.qq.com/miniprogram/dev/framework/ability/canvas.html

位置:指南 / 基础能力 /画布 /介绍

Canvas 绘制头像贴纸效果是最核心的业务逻辑。这里最主要的是使用了off-screen canvas的绘制方式,它是指在内存中创建的一个不可见的画布实例,它不直接显示在页面上。

Page({onReady() {// 创建离屏 2D canvas 实例const canvas = wx.createOffscreenCanvas({ type: '2d' });// 获取渲染 context, 用于后续的画布操作与渲染操作const context = canvas.getContext('2d');this.data.canvas = canvas;this.data.canvasCtx = context;this.data.canvasSticker = canvas.createImage();this.data.canvasSticker.src = this.data.preAvatar.sticker;}
});
Page({processImage() {const canvas = this.data.canvas;const context = this.data.canvasCtx;const image = this.data.canvasSticker;const preAvatar = this.data.preAvatar;// 计算贴纸渲染位置及宽高let scale = preAvatar.stickerPosition === 'bottom-right' ? 0.22 : 1;let dHeight = canvas.height * scale;let ratio = dHeight / image.height;let dWidth = image.width * ratio;let dx = canvas.width - dWidth;let dy = canvas.height - dHeight;// 将图片绘制到 canvas 上// context.imageSmoothingEnabled = true;// context.imageSmoothingQuality = 'high';context.drawImage(image, dx, dy, dWidth, dHeight);
});

保存图片到系统相册

文档:https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.saveImageToPhotosAlbum.html

位置:API / 媒体 / 图片 / wx.saveImageToPhotosAlbum

当用户要将制作好的贴纸效果头像保存时,就可以调用wx.saveImageToPhotosAlbum

Page({// 保存图片saveImageTapped() {if (!this.data.preAvatar.isUserAvatar) {this.preAvatarTapped();} else {wx.saveImageToPhotosAlbum({filePath: this.data.preAvatar.avatar,success: (res) => {wx.showToast({title: '已保存到相册',icon: 'none',duration: 2000});},fail: (err) => {console.log('未保存');}});}}
});

分享转发️

文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html

位置:指南 / 开放能力 / 转发 / 转发

小程序实现分享,也就是转发给微信好友的功能。

这里也设计了一张用于分享的图片。

Page({onShareAppMessage() {return {title: '免费生成领取国庆头像',imageUrl: '../../assets/images/share-c.jpeg'}}});

优化

在测试过程中发现保存图片的耗时比较长,分析下来是在 Canvas 加载图片、绘制这部分。于是优化了代码的逻辑,生成图片的步骤不限于 “保存图片”,还在于用户 “选择头像”,“选择贴纸” 这些步骤上,每当用户触发这两个方法时,就预先在 Canvas 中加载、绘制。

Page({// 离屏绘制图片, 绘制用户选择的头像drawUserAvatar() {const canvas = this.data.canvas;const context = this.data.canvasCtx;// 创建一个图片对象const image = canvas.createImage();// 设置图片资源image.src = this.data.preAvatar.avatar;// 加载图片完成回调中绘制image.onload = () => {// canvas 逻辑宽高,以用户头像为基准canvas.width = image.width;canvas.height = image.height;// 将图片绘制到 canvas 上context.drawImage(image, 0, 0);}}
});
Page({// 点击列表贴纸stickerTapped(event) {const stickerId = event.currentTarget.dataset.stickerId;// 贴纸是否切换const stickerChange = this.initStickerData(undefined, stickerId);// 贴纸切换则更新预览头像stickerChange && this.initPreAvatar(stickerId);// 用户头像时才预加载贴纸if (stickerChange && this.data.preAvatar.isUserAvatar) {this.data.canvasSticker.src = this.data.preAvatar.sticker;}}
});

🎉上线

虽然在设计上弯弯绕绕,开发上磕磕绊绊的,但好在终于完成了。

最后到了上线阶段,需要完善 “用户隐私保护指引”,小程序备案以及微信认证(30 元认证费),这部分两天就搞定了。

🌟最后

前后设计、开发、备案认证总共 1 周多几天,本想在国庆 10.1 上线,不过又怕时间太晚了,于是把发布日期定在 9.26 号了。

最后,临近国庆,祝大家工作顺心,提前祝国庆快乐!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35063.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

房产销售系统

文末获取源码和万字论文,制作不易,感谢点赞支持。 摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于房产销售系统当然也不能排除在外,随着网络技术的不…

开发一套ERP 第二个生产版本

库存管理第一个生产版本 Okay 进入测试 嘿嘿,搞完了,剩下的就是细测慢调了 下一版本可以内置sqlite 数据库来操作这些数据表,sqlite 也支持 trigger 的功能

Weiss 机器人电动夹爪,重塑工业自动化精密操作

在当今的自动化进程里,Weiss高精密电动夹爪扮演着重要的角色。Weiss公司位于德国,其精心研制的高精密电动夹爪专为工业机器人与协作机器人打造。 Weiss 高精密电动夹爪的控制方式独具特色,与传统的一些夹爪相比,Weiss电动夹爪在处…

【JVM虚拟机】面试经典八股文(应届生必看)

目录 1.JDK、JRE、JVM三者关系? 2.谈谈JVM的理解? 3.JVM执行字节码的过程?(执行方式) 4.JVM的组成是什么? 5.什么是类加载机制? 6.什么是双亲委派模型? 7.JVM内存模型 8.堆区的…

Android 实现中英文切换

在开发海外项目的时候,需要实现app内部的中英文切换功能,所有的英文都是内置的,整体思路为: 创建一个sp对象,存储当前系统的语言类型,然后在BaseActivity中对语言进行判断; //公共Activitypubl…

Qt-练习1(事件循环)

一、练习要求 1、使用QT的IO读取文件; 2、以QSlider为基础,写一个进度条,显示文件读取的进度; 3、给QSlider布置qss样式,qss文件像css文件一样,分离出来。 二、源码 全部源码 源码目录: 1.1 、m…

解决Clang 18+不能链接GCC14编译的库的问题

前面笔者的博文MSYS2 MinGW64使用Protobuf新版本踩坑,有提到使用最新的Clang 19.1.4版本在MinGW下无法正常链接使用了Protobuf 28.3的项目,因为MinGW下的项目默认都是使用GCC来编译的,所以如果开发者使用Clang编译器,必然会出现链…

城市内涝监测预警系统解决方案-智慧排水

成因分析 气候变化 受全球气候变暖导致大气水循环加快,环流不稳定性增加,进一步引发极端降雨事件受城市热岛效应、雨岛效应的影响,强降雨常集中于城市且雨量多,强度大且雨量多。 排水系统不完善 城市发展快,城市防洪排涝工程&a…

Python:使用随机森林分类器进行模型评估:ROC 曲线与 AUC 指标计算

前言 这段代码的目标是使用 随机森林分类器(Random Forest Classifier) 来进行二分类任务,并基于每个数据子集计算 ROC 曲线(Receiver Operating Characteristic Curve)以及 AUC(Area Under Curve&#xf…

【JAVA练习】力扣1232.缀点成线

题目: 解题思路: 直线上面的点满足公式:, 如果所有点在一条直线上,即任意两点的斜率相同,由于计算斜率存在精度的问题,可以将除法等价于乘法。 等价于 class Solution {public boolean che…

【SKFramework框架核心模块】3-12、网络请求模块

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群:398291828小红书小破站 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…

C# 反射(Reflection)

文章目录 前言一、反射的优缺点(一)优点(二)缺点 二、反射的用途(一)查看特性(attribute)信息(二)审查集合中的各种类型并实例化(三)实…

Jdk配置、maven配置、gradle配置、Java开发常用的依赖库

一、配置JDK环境变量: 1. 安装 JDK 首先确保已经安装了 JDK。如果还没有安装,可以从 Oracle 官网 或者 AdoptOpenJDK 下载并安装合适的 JDK 版本。 我建议下载这个:https://adoptium.net/zh-CN/temurin/releases/?oswindows&archx64&…

【AI系统】FBNet 系列

FBNet 系列 本文主要介绍 FBNet 系列,在这一章会给大家带来三种版本的 FBNet 网络,从基本 NAS 搜索方法开始,到 v3 版本的独特方法。在本节中读者会了解到如何用 NAS 搜索出最好的网络和训练参数。 FBNet V1 模型 FBNetV1:完全基于 NAS 搜…

二十三、Linux可视管理之webmin和bt运维工具

1、webmin 基本介绍 Webmin 是功能强大的基于 Web 的 Unix/linux 系统管理工具。管理员通过浏览器访问 Webmin 的各种管理功能并完成相应的管理操作。除了各版本的 linux 以外还可用于:AIX、HPUX、Solaris、Unixware、Irix 和 FreeBSD 等系统安装webmin&配置 …

聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程

聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程 系统采用FastAdmin框架独立全新开发,安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一些JD,TB等业务定制,子账号业务逻辑API 非常详细,方便内置…

Transformer真的是机器人技术的基础吗?

生成式预训练Transformer(GPT)被吹捧为将彻底改变机器人技术。但实际应用中,GPT需要庞大且昂贵的计算资源、冗长的训练时间以及(通常)非机载无线控制,诸多限制之下,GPT技术真的实用吗&#xff1…

使用脚本语言实现Lumerical官方案例——闪耀光栅(Blazed grating)(纯代码)(2)

接《使用脚本语言实现Lumerical官方案例——闪耀光栅(Blazed grating)(纯代码)(1)》 一、添加分析组 1.1 代码实现 #添加分析组 addanalysisgroup(); set("name", "grating_R"); set("x", 0); set("y", 2.5*um); addanalysisgrou…

【Java】异常处理见解,了解,进阶到熟练掌握

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 大家好我们今天来学习Java面向对象的的抽象类和接口,我们大家庭已经来啦~ 目录 1.(throws和throw)我们不管这个异常&…

Oracle数据库 用户管理模式下的冷备份与热备份

1. 用户管理模式下的冷备份 1.1. 通过数据库相关视图查询 查实例 select instance_name,version,status,archiver,database_status from v$instance; 查数据库 select dbid,name,log_mode from v$database; 查数据文件状态 select file_name,tablespace_name,status,o…