微信小程序最新canvas2d手写签名

本文介绍了一个基于canvas2d的手写签名应用实现方案,包括如何利用贝塞尔曲线平滑笔迹、调整笔迹粗细和颜色等功能。

canvas2d

在这里插入图片描述

效果

在这里插入图片描述
在这里插入图片描述

注意

  • canvas2d其实和web的canvas一样,可以参考web的canvas的api
  • canvas 2d 没有draw() 方法
  • 清空笔记可以使用clearRect()方法
  • 没有setFillStyle方法,只有fillStyle属性
  • 没有setStrokeStyle方法,只有strokeStyle属性
  • 没有setGlobalAlpha方法,只要有globalAlpha属性
  • canvas初始化建议要设置宽、高,虽然有默认值但是实际需求不一定是这样
    在这里插入图片描述

源码(mpx框架)

<template>
  <view class="wrapper">
    <view class="handBtn">
      <!-- 黑笔 -->
      <image
        catchtap="selectColorEvent"
        wx:if="{
   
   {selectColor === 'black'}}"
        src="../assets/images/color_black_selected.png"
        class="{
   
   { selectColor === 'black' ? 'color_select' : '' }} black-select"
        data-color="black"
        data-color-value="#1A1A1A"
      />
      <image
        catchtap="selectColorEvent"
        wx:if="{
   
   {selectColor !== 'black'}}"
        src="../assets/images/color_black.png"
        class="{
   
   { selectColor === 'black' ? 'color_select' : '' }} black-select"
        data-color="black"
        data-color-value="#1A1A1A"
      />
      <!-- 红笔 -->
      <image
        catchtap="selectColorEvent"
        wx:if="{
   
   {selectColor === 'red'}}"
        src="../assets/images/color_red_selected.png"
        class="{
   
   { selectColor === 'red' ? 'color_select' : '' }} red-select"
        data-color="red"
        data-color-value="#ca262a"
      />
      <image
        wx:if="{
   
   {selectColor !== 'red'}}"
        catchtap="selectColorEvent"
        src="../assets/images/color_red.png"
        class="{
   
   { selectColor === 'red' ? 'color_select' : '' }} red-select"
        data-color="red"
        data-color-value="#ca262a"
      />
      <button catchtap="retDraw" class="delBtn">重写</button>
      <button catchtap="subCanvas" class="subBtn">完成</button>
    </view>
    <view class="handCenter">
      <canvas
        class="handWriting"
        disable-scroll="true"
        bindtouchstart="uploadScaleStart"
        bindtouchmove="uploadScaleMove"
        bindtouchend="uploadScaleEnd"
        type="2d"
        id="myCanvas"
      ></canvas>
    </view>
    <view class="handRight">
      <view class="handTitle">手写板</view>
    </view>
  </view>
</template>
<script>
import {
   
    createPage } from '@mpxjs/core'
const app = getApp()
/*
 * canvas 2d 没有draw() 方法
 * 清空笔记可以使用clearRect()方法
 * 没有setFillStyle方法,只有fillStyle属性
 * 没有setStrokeStyle方法,只有strokeStyle属性
 * 没有setGlobalAlpha方法,只要有globalAlpha属性
 */
createPage({
   
   
  data: {
   
   
    canvasName: 'myCanvas',
    ctx: '', // 上下文实例
    canvas: '', // 画布实例
    canvasWidth: 0,
    canvasHeight: 0,
    transparent: 1, // 透明度
    selectColor: 'black',
    lineColor: '#1A1A1A', // 颜色
    lineSize: 1.5, // 笔记倍数
    lineMin: 0.5, // 最小笔画半径
    lineMax: 4, // 最大笔画半径
    pressure: 1, // 默认压力
    smoothness: 60, //顺滑度,用60的距离来计算速度
    currentPoint: {
   
   },
    currentLine: [], // 当前线条
    firstTouch: true, // 第一次触发
    radius: 1, //画圆的半径
    cutArea: {
   
    top: 0, right: 0, bottom: 0, left: 0 }, //裁剪区域
    bethelPoint: [], //保存所有线条 生成的贝塞尔点;
    lastPoint: 0,
    chirography: [], //笔迹
    currentChirography: {
   
   }, //当前笔迹
    linePrack: [] //划线轨迹 , 生成线条的实际点
  },
  onLoad() {
   
   
    let canvasName = this.data.canvasName
    // let ctx = wx.createCanvasContext(canvasName)
    const query = wx.createSelectorQuery()
    query
      .select('#myCanvas')
      .fields({
   
    node: true, size: true })
      .exec(res => {
   
   
        const canvas = res[0].node
        const ctx = canvas.getContext('2d')
        this.setData({
   
   
          ctx: ctx,
          canvas: canvas
        })
        query
          .select('.handCenter')
          .boundingClientRect(rect => {
   
   
            this.setData({
   
   
              canvasWidth: rect.width,
              canvasHeight: rect.height
            })
            canvas.width = rect.width
            canvas.height = rect.height
            /* 将canvas背景设置为 白底,不设置  导出的canvas的背景为透明 */
            // console.log(this, 'hahah');
            this.setCanvasBg('#fff')
          })
          .exec()
      })
  },
  methods: {
   
   
    // 重写事件(初始化画布)
    retDraw() {
   
   
      this.data.ctx.clearRect(0, 0, 700, 730)
      //设置canvas背景
      this.setCanvasBg('#fff')
    },
    // 完成事件
    subCanvas() {
   
   
      // 调用预览
      this.previewCanvasImg()
    },
    //画两点之间的线条;参数为:line,会绘制最近的开始的两个点;
    pointToLine(line) {
   
   
      this.calcBethelLine
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值