我们的小程序中有一个功能,会根据用户信息生成图片,并可以保存到相册。第一次是使用前端发起请求,后端生成图片上传到阿里云后给前端返回图片地址,但是上线后发现图片出来的很慢,平均要6~7秒。第二次是使用小程序的 canvas api 在前端绘制图片,可达到平局在3秒左右,但这个过程也遇到了一些问题,描述如下。
多屏幕适配问题
设计稿是基于 375 * 667 尺寸的,如果是用 image 显示图片,我们可以通过计算或使用适配的单位来进行多屏适配。但是 canvas 中不能使用适配的单位,但是可以获取到屏幕的宽度,自己计算每一个尺寸应该有多大,比较麻烦。更好的做法是在绘制前使用 canvasContext.scale api 进行缩放,后面直接使用设计稿中固定的尺寸绘制即可。
绘制圆形用户微信头像
canvas 中绘制图片时,需要先使用 wx.downloadFile api 下载文件到本地,再使用返回的临时路径绘制图片。注意下载的图片的域名需要添加在 downloadFile 合法域名中,否则 iOS 不显示图片。之后使用 canvasContext.clip api 将图片切成圆形。
居中显示不同样式的文字
图片的中间需要显示“第 xxx 天”,整行文字需要居中显示,但数字的字体比较大,因此无法直接使用 canvasContext.setTextAlign api 进行文字居中设置。可使用 canvasContext.measureText
api 先计算出数字显示需要的宽度,然后将 “第 ” 和 “ 天” 放在计算后的位置居右和距左对齐。
Modal 形式的图片被 canvas 覆盖
canvas 属于原生组件,层级是最高的,页面中如果有需要弹出 Modal 的地方,是无法显示在 canvas 上面的。经试验,如果使用两个 canvas,是可以达到一个 canvas 在另一个 canvas 上面的,但是因为我们的项目中弹出的 Modal 有一个按钮,因此无法使用这种方式。我们采用了在屏幕的外面绘制图片,绝对定位,top 为负值,然后下载到本地,用 image 标签引用本地路径来显示图片。
完整示例代码
|
|