继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

canvas实现的画板功能

喵居
关注TA
已关注
手记 37
粉丝 6
获赞 35

闲来无事正好团队准备做一个画板相关的项目,虽然我不在其中但是对这个画板还是蛮有兴趣的。
主要是通过canvas这个标签加上鼠标的一些相关事件来实现的。
中间有碰到过一个bug
canvas的画板大小不能通过css来设置,css会缩放大小导致获取到的点坐标是正确的但是在canvas上显示的位置确是有偏差的
这里的解决办法是直接在canvas标签上的width和height设置长和宽。

<template>
  <div class="canvas">
    <button @click="resetCanvas">清空canvas</button>
    <canvas width="500px" height="300px" ref="canvas"></canvas>
  </div>
</template>

<script>
export default {
  name: "canvas",
  components: {},
  data() {
    return {};
  },
  mounted() {
    this.init();
  },
  methods: {
    init() {
      let canvas = this.$refs.canvas
      let ctx = canvas.getContext("2d")
      let startPosition = []
      let isdraw = false
      ctx.fillStyle = "#999999"
      ctx.fillRect(0, 0, 500, 300)
      ctx.lineWidth = 1
      canvas.onmousedown = res => {
        //指针在canvas上点击
        isdraw = true;
        startPosition[0] = res.offsetX
        startPosition[1] = res.offsetY
        drawLine(res.offsetX,res.offsetY)
        console.log(res)
      };
      canvas.onmouseup = res => {
        //指针在canvas上放开
        if (!isdraw) return;
        clear()
      };
      canvas.onmouseout = res => {
        //指针移出canvas
        if (!isdraw) return;
        clear()
      };
      canvas.onmousemove = res => {
        //指针在canvas移动
        if (!isdraw) return;
        drawLine(res.offsetX,res.offsetY)
      };
      function drawLine(X,Y) {
        //画图
        if (!isdraw) return;
        ctx.beginPath();
        console.log(X,Y)
        ctx.moveTo(startPosition[0],startPosition[1])
        startPosition = [X,Y]
        ctx.lineTo(X,Y);
        ctx.stroke();
        ctx.save()
      }
      function clear() {
        isdraw = false;
        startPosition = []
      }
    },
    resetCanvas() {
      //清空canvas
      let canvas = this.$refs.canvas
      let ctx = canvas.getContext("2d")
      let startPosition = []
      let isdraw = false
      ctx.fillStyle = "#999999"
      ctx.fillRect(0, 0, 500, 300)
    }
  }
};
</script>
<style lang='scss' scoped>
canvas {
  
}
</style>

哈哈字有点丑~~~但是问题不大!!!

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP