如何用canvas实现在线签名的示例代码


当前第2页 返回上一页

因为我们需要同时兼容 PC 端和移动端,所以我们需要事先需要判断一下对应执行的事件

1

2

3

this.state = {

events: ('ontouchstart' in window) ? ['touchstart', 'touchmove', 'touchend'] : ['mousedown', 'mousemove', 'mouseup']

}

在画布初始化之后,我们开始监听 events[0] 事件

1

this.canvas.addEventListener(this.events[0], startEventHandler, false);

在startEventHandler函数中监听 events[1] 和 events[2] 事件

1

2

this.canvas.addEventListener(events[1], moveEventHandler, false);

this.canvas.addEventListener(events[2], endEventHandler, false);

重点来了,我们核心的内容就是计算、描绘划过的路径

1

2

3

4

5

6

7

8

9

10

11

12

13

moveEventHandler(event: any): void {

    event.preventDefault();

    const {ctx, isSupportTouch} = this.state;

    const evt = isSupportTouch ? event.touches[0] : event;

    const coverPos = this.canvas.getBoundingClientRect();

    const mouseX = evt.clientX - coverPos.left;

    const mouseY = evt.clientY - coverPos.top;

    cxt.lineTo(

       mouseX,

       mouseY

    );

    cxt.stroke();

}

了解 Canvas 的知道, Canvas 画布为我们提供了一个用来作图的平面空间,该空间的每个点都有自己的坐标,x 表示横坐标,y 表示竖坐标。原点 (0, 0) 位于图像左上角,x 轴的正向是原点向右,y 轴的正向是原点向下。

于是我们通过 getBoundingClientRect() 方法获得页面 Canvas 元素相对浏览器视窗的位置左边和顶部的像素距离,再利用 clientX,clientY 事件属性返回当事件被触发时鼠标指针向对于浏览器页面的水平和垂直坐标,最后通过 lineTo 和 stroke 来绘制路径。

同时,我们要记得在 events[2] 事件执行之后,移除 events[1]、events[2] 事件,否则会造成一直绘制。

1

2

3

4

5

6

endEventHandler(event: any): void {

    event.preventDefault();

    const {events, moveEventHandler, endEventHandler} = this.state;

    this.canvas.removeEventListener(events[1], moveEventHandler, false);

    this.canvas.removeEventListener(events[2], endEventHandler, false);

}

如此反复循环上述事件操作,我们的签字功能就基本实现了。

重新绘制

签字过程中,签错或是签的过于潦草是必不可免的,所以我们需要支持清空签字的功能,这时,我们利用 Canvas 的 clearRect() 方法就可以帮助我们清除画布区域内容。

1

cxt.clearRect(0, 0, canvasWidth, canvasHeight);

图片处理

绘制之后我们还没完事,我们还需要把绘制的签名上传保存。这时,我们可以利用 toDataURL() 方法将 Canvas 转化成一般的图像文件形式。

通常我们直接执行以操作就能转化成 data URI,然后再利用 ajax 请求上传就完事了。

1

2

3

dataurl = this.canvas.toDataURL('image/png');

//or

dataurl = this.canvas.toDataURL('image/jpeg', 0.8);

但是,由于各种业务需求,我们有时需要携带页面其他内容,这时,我们可以借助 html2canvas 来实现。html2canvas 可以帮助我们对浏览器端整个或部分页面进行截屏,并渲染成一个 Canvas ,然后我们在利用 toDataURL() 方法进行处理。

说道 html2canvas,顺便给大家一个绕坑提示,它在一些低版本浏览器截出来的图片是空白的,原因是使用了flex 布局,而html2canvas并不支持 -webkit-flex 或 -webkit-box,所以无法将 HTML 生成 Canvas,从而导致了截出一张白屏。

解决办法:

  • 不使用flex布局

  • 修改 html2canvas 源码,在html2canvas\dist\npm\parsing\display.js 文件中增加 -webkit-flex 和 -webkit-box 也返回 DISPLAY.FLEX; 小结

通过以上几步,我们就基本实现了在线签名的功能。值得注意的是,这个项目我们使用的 React+TypeScript 环境构建,上述代码的实际使用需要结合自己环境进行适当修改。

文中使用的是 Canvas 比较浅层的绘制知识,如果想利用Canvas进动画制作、物理效果模拟、碰撞检测、游戏开发、移动应用开发、大数据可视化开发,还需要我们复习一下之前学过的数学几何、物理方面的知识,然后在慢慢摸索。现在很多成熟的图表插件都是用 Canvas 实现的,例如 Chart.js、ECharts等,里面很多好看炫酷的图表,几乎覆盖了所有图表的实现。Canvas还有很多开源类库,例如 ZRender、createJS、Pixi.js等,ECharts底层也是依赖轻量级的 Canvas 类库 ZRender 进行封装的。

以上就是如何用canvas实现在线签名的示例代码的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

如何使用html5 canvas绘制一个矩形

html5 canvas的绘制文本自动换行的示例代码

canvas的手绘风格图形库rough.js

介绍html5+canvas调用手机拍照功能实现图片上传(下篇)

html5如何使用canvas画空心圆与实心圆

图文详解如何用canvas画实心圆和空心圆

canvas 动态图表

实现弹幕效果的方法总结(css和canvas

怎样用h5 canvas实现3d动态chart图表

canvas实现二维码和图片合成的示例代码

更多相关阅读请进入《canvas》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...