微信小程序canvas实现画图可以恢复上一步操作以及从头演示(有效果图)

效果图

请添加图片描述

.wxml

<canvas disable-scroll="{{true}}" style="width:100%;height:400px;background-color: #fff;"
  type="2d" id="canvas" bindtouchstart="canstart" bindtouchmove="canvasmove"
></canvas>
<button bindtap="save">保存画布</button>
<button bindtap="canvas_restore" data-type="1">撤销</button>
<button disabled="{{disabled}}" bindtap="canvas_restore" data-type="2">演示绘画</button>

.js

var canvas = null,ctx = null,dpr = wx.getSystemInfoSync().pixelRatio
Page({
  data: {
    canvas_neto:[],
    disabled:false,
  },
  onLoad(){
    wx.createSelectorQuery().select('#canvas')
    .fields({ node: true, size: true })
    .exec((res) => {
      canvas = res[0].node
      ctx = canvas.getContext('2d')
      canvas.width = res[0].width * dpr
      canvas.height = res[0].height * dpr
      ctx.strokeStyle = "#0081ff"
      ctx.lineWidth = 3
      ctx.scale(dpr, dpr)
    })
  },
  canstart(e){
    ctx.beginPath()
    ctx.moveTo(e.changedTouches[0].x,e.changedTouches[0].y)
    this.data.canvas_neto.push({point_x:e.changedTouches[0].x,point_y:e.changedTouches[0].y,list:[]})
  },
  canvasmove(e){
    ctx.lineTo(e.touches[0].x, e.touches[0].y)
    ctx.stroke()
    this.data.canvas_neto[this.data.canvas_neto.length - 1].list.push({x:e.touches[0].x,y:e.touches[0].y})
  },
  canvas_restore(e){
    var that = this
    var type = e.currentTarget.dataset.type
    var canvas_neto = that.data.canvas_neto
    if(canvas_neto.length < 1){
      return false      
    }
    that.setData({
      disabled:true
    })
    ctx.clearRect(0, 0, canvas.width / 2, canvas.height / 2)
    if(type == 1){
      canvas_neto.splice(canvas_neto.length - 1, 1); 
      for(let i = 0;i < canvas_neto.length;i++){
        ctx.beginPath()
        ctx.moveTo(canvas_neto[i].point_x, canvas_neto[i].point_y)
        for(let j = 0;j < canvas_neto[i].list.length;j++){
          ctx.lineTo(canvas_neto[i].list[j].x, canvas_neto[i].list[j].y)
          ctx.stroke()
        }
      }
      this.setData({
        disabled:false
      })
    }else{
      var i = 0,j = 0;
      ctx.beginPath()
      ctx.moveTo(canvas_neto[i].point_x, canvas_neto[i].point_y)
      numDH(i,j)
      function numDH() {
        if(j < canvas_neto[i].list.length){
          setTimeout(function () {
            ctx.lineTo(canvas_neto[i].list[j].x, canvas_neto[i].list[j].y)
              ctx.stroke()
            j++
            numDH()
          }, 20)
        }else{
          i++
          j = 0
          if(i < canvas_neto.length){
            ctx.beginPath()
            ctx.moveTo(canvas_neto[i].point_x, canvas_neto[i].point_y)
            numDH()
          }else{
            that.setData({
              disabled:false
            })
          }
        }
      }
    }
  },
  save(){
    wx.canvasToTempFilePath({
      canvas: canvas,
      success(res) {
        wx.saveImageToPhotosAlbum({
          filePath: res.tempFilePath,
          success(res) { 
            wx.showToast({
              title: '保存成功~',
            })
          }
        })
      }
    })
  }
})

遇到问题可以看我主页加我Q,很少看博客,对你有帮助别忘记点赞收藏。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值