【微信开发】原生小程序开发实现画布canvas-2d签字

分享一个原生小程序开发实现画布canvas-2d签字的经验。

(太搞了,官网里面太多东西没有)

画布更新后,方法什么的全是和Web一样的了。(最后搞了很久,到处看。)

 

微信开发官方文档:(全是老版的,也就看看怎么初始化画布的,害~)

Canvas 画布 | 微信开放文档z微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/framework/ability/canvas.html

还得是直接看Web的:

w3school文档:

HTML Canvas 参考手册https://www.w3school.com.cn/tags/html_ref_canvas.asp

了解了一下里面的一些方法什么的。

实现签名其实最主要的就是几个步骤:

1. 初始化画布。可以看看官方文档里面;

2. 在bindtouchstart(绑定的触碰开始事件)中起始一条路径,然后把路径移动到画布中的指定点(moveTo());

3. 在bindtouchmove(绑定的触碰移动事件)中增加一个新点,然后创建一条从上次指定点到目标点的线(lineTo());

4. 最后使用stroke()方法来画线条

其中的方法在w3school中都有!可以自己去了解一下。

需要横屏记得在json中加入"pageOrientation": "landscape",如下:

{
  "usingComponents": {},
  "pageOrientation": "landscape"
}

下面就是源码:(如果想要将画布上的内容导出图片,可以使用wx.canvasToTempFilePath,在“canvas: ”这一栏填入的是我们在初始化时存上的画布对象。

1.wxml:

<view class="root">

	<canvas 
	id="myCanvas" class="myCanvas" type="2d" 
	bindtouchstart="startTouchClick" 
	bindtouchmove="moveClick"
	bindtouchend="endTouchClick"
	binderror="errorClick"></canvas>

</view>

2.wxss:

.root {
	width: 100%;
	height: 100vh;
	display: flex;
	flex-direction: column;
	align-items: center;
	background-color: white;
}

.myCanvas {
	width: 100%;
	height: 100%;
	background-color: white;
}

3.js :

Page({
 
  /**
   * 页面的初始数据
   */
  data: {

    ctx : '',
      
  },
  
  startTouchClick(e){
    console.log("开始触碰事件:",e);

    let ctx = this.data.ctx;

    ctx.beginPath();//起始一条路径,或重置当前路径

    ctx.moveTo(e.changedTouches[0].x, e.changedTouches[0].y) // 把路径移动到画布中的指定点,不创建线条。用 stroke 方法来画线条

  },

  moveClick(e){
    console.log("移动事件:",e);

    let ctx = this.data.ctx;

    ctx.lineTo(e.changedTouches[0].x, e.changedTouches[0].y) // 增加一个新点,然后创建一条从上次指定点到目标点的线。
    ctx.lineWidth=2.5;//设置轨迹的宽度
    ctx.stroke()//用 stroke 方法来画线条
  },

  //触摸结束
  endTouchClick(e){
    console.log("触碰结束事件:",e);
  },

  //误触事件
  errorClick(e){
    console.log("误触事件:",e);
  },

  //初始化画布
  initCanvas(){

    let ctx ;

    wx.createSelectorQuery()
    .select('#myCanvas') // 在 WXML 中填入的 id
    .fields({ node: true, size: true })
    .exec((res) => {

        // Canvas 对象
        const canvas = res[0].node
        this.setData({
          canvas : canvas
        })

        // 渲染上下文
        ctx = canvas.getContext('2d')
        this.setData({
          ctx : ctx
        })

        // Canvas 画布的实际绘制宽高
        const width = res[0].width
        const height = res[0].height

        // 初始化画布大小
        const dpr = wx.getWindowInfo().pixelRatio
        this.setData({
          dpr : dpr
        })

        canvas.width = width * dpr
        canvas.height = height * dpr//设置宽高
        ctx.scale(dpr, dpr)//scale() : 缩放当前绘图至更大或更小

        

        // 清空画布
        ctx.clearRect(0, 0, width, height)
    })

  },
 
  /**
   * 生命周期函数--监听页面加载
   */
    // 生命周期函数--监听页面加载
  onLoad: function (options) {

    this.initCanvas();
    
  },

  onReady(){

  },
 
})

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值