# 前言
本篇记录一下之前在支付宝小程序上实现的6字明文密码生成图片后保存到图库功能。图库内保存的密码图片样式如下所示:
技术点
实现上图功能主要使用了:
其中和绘制相关的是my.createCanvasContext
,该方法创建返回了CanvasContext 绘图上下文。CanvasContext如同Android中的Canvas画布,提供了一系列关于绘制的方法,比如:
- fillText:在画布上绘制被填充的文本
- setFillStyle:设置 Canvas 填充色
- setFontSize:设置 Canvas 字体大小
- lineTo:使用直线连接子路径的终点到某个坐标的方法
- arc:在 Canvas 上绘制圆弧路径
- save:保存 canvas 全部状态的方法
- restore:将 canvas 恢复到最近的保存状态的方法
- beginPath:在 Canvas 上开始一个新路径
- closePath:将笔点返回到当前子路径起始点的方法
- fill:根据当前的填充样式填充当前或已存在的路径的方法
- translate:对当前网格添加平移变换的方法
- stroke:用于画出当前路径的边框
- draw:提交 Canvas 绘制指令
上述列出的CanvasContext
的方法为本次绘制卡片效果所调用的绘制接口,CanvasContext提供的其余方法可至官方文档查看:CanvasContext 概览
CanvasContext无法直接将绘制的内容保存到图库,但是官方文档「 canvas组件如何实现生成图片保存 」内提供了实现方式,即:使用CanvasContext.toTempFilePath 把当前画布的内容导出生成图片,获取图片路径(临时路径),再 通过 my.saveImage 保存图片到相册。
所以整个实现的伪代码如下:
1 | //1.绘制画布内容 |
细节
如同上述伪代码,主要是canvas内容绘制和保存。
Canvas绘制
通过my.createCanvasContext
,创建获取CanvasContext 绘图上下文,其中入参canvasId为<canvas>
组件的 id 属性,如下,为once-key
:
其中css样式为:
1 | .canvas_pwd { |
所以创建为:this._ctx = my.createCanvasContext('once-key')
其中_ctx
就是 CanvasContext 对象,通过它来绘制各种所需的内容。
本次功能需求主要分为:
- 绘制圆角矩形背景
- 绘制顶部标题
- 绘制分割线
- 绘制密码区域
- 绘制底部提示文本
归纳后其实主要分为两种:绘制圆角矩形、绘制文本。
绘制圆角矩形
小程序的坐标系同Android上的一样,x轴为水平向右➡️,y轴为竖直向下⬇️。
如下roundRect
方法所示,分别绘制了左上、右上、右下、左下角上的1/4的圆,以及各边。
其中使用arc
在 Canvas 上绘制圆弧路径,其中 startAngle: 起始弧度,单位弧度(在 3 点钟方向)。具体定义如下:
1 | /** |
1 |
|
绘制文本
1 | /** |
绘制密码区域
密码区域拆分开来,每个密码显示UI就是圆角矩形的背景和居中的数字文本,并且每个密码UI平分卡片UI总宽度(减去设置的边距)。
根据密码长度、卡片总宽度、margin等值计算出密码块的宽高、数字密码的y轴坐标,再配合translate
、roundRect
、drawText
方法遍历绘制各个密码块。
其中便利数组使用of
。
1 | /** |
完整代码
save-key-card.js
1 | import { measureText } from "./utils"; |
utils.js
1 |
|
使用示例
js
1 | import KeyCard from './save-key-card'; |
axml
1 | <canvas id="once-key" class="canvas_pwd" width="670" height="470"></canvas> |