uni-app绘制印章

185 阅读1分钟
使用
/*
* 注意canvas必须放到最外层,放到内部组件逻辑执行但canvas会是空
* 官方的解释是:
  canvas必须一进来就要挂载,这样他才能绘制,感觉应该是有什么技术壁垒
*/
<canvas canvas-id="disId" class="canvas" v-show="tabIndex === 0"/>
import { CanvasYinzhang } from './components/Certificate/util.js'
// 传入参数:canvasid  companyName: 公司名称
CanvasYinzhang('disId', 'xxxx股份有限公司');
封装方法
export function create5star (cxt, sx, sy, radius, color, rotato) {
	cxt.save();
	cxt.setFillStyle(color);
	cxt.translate(100, 100);
	cxt.beginPath();
	var dig = Math.PI / 5 * 4;
	for (var i = 0; i < 5; i++) {//画五角星的五条边
		var x = Math.sin(i * dig);
		var y = Math.cos(i * dig);
		cxt.lineTo(x * radius, y * radius);
	}
	cxt.closePath();
	cxt.stroke();
	cxt.fill();
	cxt.restore();
}
export function CanvasYinzhang(canvasId, companyName){
	var context = uni.createCanvasContext(canvasId);
	var text = "";
	context.setLineCap('round');//设置线两端端点样式更加圆润
	context.setLineJoin('round');//设置两条线连接处更加圆润
	context.setStrokeStyle("#ff0000");//设置线的颜色
	context.setLineWidth(3);//设置线条的宽度
	context.moveTo(190, 100);
	context.arc(100, 100, 90, 0, Math.PI * 2);//宽、高、半径
	context.stroke();
	// 绘制五角星
	create5star(context, 100, 100, 25, "#f00", 0);
	context.setFontSize('19');
	context.setTextBaseline('middle');
	context.setTextAlign('center');
	context.setLineWidth(2);
	context.setFillStyle('#f00');
	// context.strokeText(text, 100, 140);
	// 绘制印章单位
	context.translate(100,100);
	// context.font = '20px 黑体';
	var count = companyName.length;
	var angle = 4 * Math.PI / (3 * (count - 1));
	var chars = companyName.split("");
	var c;
	for (var i = 0; i < count; i++) {
		c = chars[i];
		if (i == 0) {
			context.rotate(5 * Math.PI / 6);
		} else{
			context.rotate(angle);
		}
		context.save();
		context.translate(70, 0);
		context.rotate(Math.PI / 2)
		context.setFillStyle("#ff0000");
		context.fillText(c, 0, 0);
		context.restore();
	}
	setTimeout(() => {
		context.draw();
	}, 200);
}