首页 > 编程语言 >Vue3+Taro+NutUI 微信小程序使用canvas组件完成电子签名功能

Vue3+Taro+NutUI 微信小程序使用canvas组件完成电子签名功能

时间:2022-11-08 15:48:06浏览次数:41  
标签:canvas Taro dpr NutUI res ctx state

使用Taro小程序开发框架中的canvas组件实现电子签名功能,实现签名时屏幕自动横屏,可清空签名重签,可保存导出图片的64位码。

注意,width和height必须写着canvas的属性里边,如果使用style样式来设置宽高会造成偏移等问题,分析原因应该是属性是改变的canvas的内部宽高,style只是改变了canvas的外部样式宽高,造成canvas拉伸发生偏移。

布局部分代码:

ts代码:
onMounted(() => {
eventCenter.once((getCurrentInstanceTaro() as any).router.onReady, () => {
Taro.createSelectorQuery()
.select(".sbcanvas")
.fields(
{
node: true,
size: true,
},
function(res) {
const dpr = Taro.getSystemInfoSync().pixelRatio;
const canvas = res.node;
const ctx = canvas.getContext("2d");
ctx.strokeStyle = props.strokeStyle;
ctx.lineWidth = props.lineWidth;
canvas.width = res.width * dpr;
canvas.height = res.height * dpr;
ctx.scale(dpr, dpr);
state.canvas = canvas;
state.ctx = ctx;
state.dpr = dpr;
state.ctx.font = "10px Arial";
state.canvasWidth = canvas.width;
state.canvasHeight = canvas.height;
}
)
.exec();
Taro.createSelectorQuery()
.select(".sbcanvas")
.boundingClientRect()
.exec(res => {
state.canvasRect = res[0];
})
});
});
使用选择Tora选择器获取vanvas实例,通过scale消除锯齿
canvas.width = res.width * dpr;
canvas.height = res.height * dpr;
ctx.scale(dpr, dpr);

	  const startEventHandler = (event) => {

state.isButtonDown = true;
state.arrz.push(0);
state.arrx.push(event.changedTouches[0].x);
state.arry.push(event.changedTouches[0].y);
};
const moveEventHandler = (event) => {
if (state.isButtonDown) {
state.arrz.push(1);
state.arrx.push(event.changedTouches[0].x);
state.arry.push(event.changedTouches[0].y);
};

state.ctx.beginPath();
for (let i = 0; i < state.arrx.length; i++) {
if (state.arrz[i] == 0) {
state.ctx.moveTo(state.arrx[i], state.arry[i])
} else {
state.ctx.lineTo(state.arrx[i], state.arry[i])
};

};

state.ctx.stroke();//绘制已定义的路径。

};
const endEventHandler = (event) => {
state.isButtonDown = false;
};
通过touchstart,touchmove,touchend事件完成画布上写字的功能
state.ctx.moveTo() 落笔到起点、
state.ctx.lineTo()到终点划线。
state.ctx.stroke()完成绘制路径。

const signClear = () => {
state.arrx = [];
state.arry = [];
state.arrz = [];

state.ctx.clearRect(0,0,state.canvasWidth,state.canvasHeight);
};
擦除签名重签

const signOk = () => {
let image: any;
Taro.createSelectorQuery()
.select('.sbcanvas')
.fields({
node: true,
size: true,
})
.exec((res) => {
const canvas = res[0].node
image = canvas.toDataURL("image/png");
if(image){
emits('callLossSignDoc',image);
};
});
}

通过选择器获取canvas组件,然后使用toDataURL方法获取图像的base64位码。

// setTimeout(() => {
// let imgData = state.ctx.getImageData(0, 0, state.canvasWidth, state.canvasHeight);
// console.log(imgData);
// //state.ctx.putImageData(imgData,60,60);
// let newdata = imgData.data.buffer;
// console.log(newdata);
// let base64 = Taro.arrayBufferToBase64(newdata);
// console.log(base64);
// },500);

//使用Taro的api提示"canvasGetImageData: fail canvas is empty
// setTimeout(() => {
// Taro.canvasGetImageData({
// canvasId: "godCanvas",
// x: 0,
// y: 0,
// width: state.canvasWidth,
// height: state.canvasHeight,
// success(res){
// console.log(res);
// }
// }, state.canvas)
// },300);
//
// setTimeout(() => {
// Taro.canvasToTempFilePath({
// x: 0,
// y: 0,
// canvas:state.canvas,
// height:state.canvasHeight,
// canvasId: 'godCanvas',
// fileType: 'png',
// success(res) {
// console.log(res);
// let imgBase64 = Taro.getFileSystemManager().readFileSync(res.tempFilePath, 'base64');
// console.log(imgBase64);
// setTimeout(() => {
// Taro.saveImageToPhotosAlbum({
// filePath: res.tempFilePath,
// success() {
// console.log('已保存到本地相册' + res.tempFilePath);
// }
// });
// }, 300);
// }
// },state.canvas);
// },300);
尝试使用getImageData和canvasToTempFilePath图片路径方法都无法获取签名的图片。使用js原生选择器选择canvas组件,无法获取canvas实例。

标签:canvas,Taro,dpr,NutUI,res,ctx,state
From: https://www.cnblogs.com/jiangyuhu/p/16869880.html

相关文章

  • Canvas实现视频截图的功能
    1、首先获取video元素和创建canvasconstvideo=document.getElementById('video');constcanvas=document.createElement("canvas");constcanvasCtx=canvas.get......
  • canvas-基础(一)
    盲区1:事件绑定: js中的事件绑定可以一次绑定多个事件。比如鼠标移动事件。  事件的移除:需要注意的点就是removeEventListener时,第二个参数需要带上绑定的函数,并......
  • PowerApps Canvas App Vs Model-driven App Vs Portal App
    TheCanvasAppinPowerAppsCanvas isoneofthemaintypesofapplicationsthatyoucancreateinPowerApps.Itgivesyouablankcanvasandallowsyoutod......
  • Taro+vue3+nutui微信小程序项目使用icon-font多色图标
    根据nutui文档nut-icon组件的图片链接方式实现多色图标渲染在使用nutui图标组件(nut-icon)时发现,根据引入的icon-fontcss文件使用多色图标,渲染效果黑白色原因:未使用s......
  • CanvasAPP通过web端访问时,如何隐藏顶部栏
    如下图所示,当我们通过url链接访问canvasapp时,顶部有个导航栏  如何隐藏导航栏呢,只需要在访问的url后面加上参数&hidenavbar=true即可,效果如下图  ......
  • QML中绘图(1、Canvas 2、QPainter与QML结合)
     QML中的Canvas和HTML5中Canvas是一样的,可以参考W3CSchool中的学习方法:​​HTML5Canvas参考手册​​画线、删除线、删除全部实例: 不过,QML中的Canvas不够强大,画线会卡。......
  • js canvas
      <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"......
  • vue canvas 线上签名
    <template> <divid="box">   <divclass="main"id='main'>     <canvasref="saveCanvas"width="500"height="400"@mousedown="ctxDown($event)"@mousem......
  • Canvas基本绘制操作
    Canvas绘制线条中常见的属性和方法属性(方法)说明linwWidth定义线条的宽度,属性值为整数,默认是1,默认单位是pxlineCap定义线条开始和结尾处的线帽样式,属性值:butt(默认值,无线帽)......
  • Canvas实现多叶草效果的封装
    四叶草的效果:想要实现四叶草以及多叶草的效果,需要了解四叶草的构成。想要在网页上作图,则需要添加画布Canvas,而四叶草是由曲线构成的,可以使用贝塞尔曲线来绘制,HTML代码:<can......