使用canvas实现涂鸦板

723 阅读2分钟

前言

最近在学canvas,正好掘金也在给我推送相关的文章,我也看了很多大佬用canvas写的很有趣的案例,所以我也想试试用canvas写一下涂鸦板。

基本功能

  • 画笔
  • 橡皮擦
  • 自定义画笔粗细和橡皮擦大小
  • 清空画板
  • 改变画笔颜色

成品:www.dz8545.xyz/#/main/draw(用电脑打开,手机有点小bug)

QQ录屏20220504210212.gif

实现

首先实现的是画笔,要完成的效果是按住鼠标移动在屏幕上画画。其实要实现该功能很简单,因为canvas就是干这个的啊,canvas就是画布嘛。

具体实现:在鼠标按下后,记录该点位置,并将绘制光标移动到该点。之后只要监听鼠标移动事件,并使用lineTo()将绘制光标坐标和鼠标当前位置连起来就行了

document.onmousedown = (event)=>{
            ctx.beginPath()
            ctx.moveTo(event.clientX, event.clientY)
            document.onmousemove = (event)=>{
                ctx.lineTo(event.clientX, event.clientY)
                ctx.stroke()
                
            }
            document.onmouseup = ()=>{  
                document.onmousemove = null
                document.onmouseup = null
            }
        }

再是橡皮擦了,要完成的效果是按住鼠标移动可以将画板上的痕迹擦除。使用clearRect()方法可以擦除画布中某个区域。

具体实现:在鼠标按下后,监听鼠标移动,并使用clearRect()将鼠标当前位置范围擦除

注意:clearRect()擦除的是一个矩形,我们可以将鼠标当前坐标减去我们想要擦除范围的一半作为起点,这样可以使鼠标在橡皮中间,看起来好看点。而且橡皮大小是可以改变的,所以不能写死了,我是使用w来代替

document.onmousedown = (event) => {
    ctx.beginPath();
    ctx.lineWidth = w.value;
    ctx.strokeStyle = color.value;
    const beginX = event.clientX - canvas.offsetLeft;
    const beginY = event.clientY - canvas.offsetTop;
    ctx.moveTo(beginX, beginY);
    document.onmousemove = (event) => {
      const endX = event.clientX - canvas.offsetLeft;
      const endY = event.clientY - canvas.offsetTop;
      switch (k.value) {
        case "画笔":
          ctx.lineTo(endX, endY);
          ctx.stroke();
          break;
        case "橡皮":
          ctx.clearRect(
            endX - w.value,//w.value是擦除范围宽度的一半
            endY - w.value,
            2 * w.value,
            2 * w.value
          );
          break;
        default:
          break;
      }
    };
    document.onmouseup = () => {
      document.onmousemove = null;
      document.onmouseup = null;
    };
  };

自定义画笔和橡皮大小,其实都不难,画笔大小可以使用lineWidth改变,而橡皮大小也可以通过改变clearRect()中的宽高实现

清空画板,可以使用clearRect(0,0,canvas.width,canvas.heigth)实现(canvas.width是指画板的宽)

改变画笔颜色,可以使用 strokeStyle改变。

至此基本就完成了