Javascript 点击时仅填写 canvas 的特定部分

Javascript fill only certain part of canvas on click

我想使用 javascript 在单击时 canvas 绘图的特定部分添加阴影。下面是我在圆圈内绘制正方形的代码。

<!DOCTYPE HTML>
<html>
    <head>
    </head>
    <body>
    
     <canvas width="300" height="300" id="myCanvas" style="border:1px solid #000000;"></canvas>
     <script>
        const canvas = document.getElementById('myCanvas');
        const context = canvas.getContext('2d');
        const centerX = canvas.width / 2;
        const centerY = canvas.height / 2;
        const radius = 70;

        context.beginPath();
        context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);

        context.rect(centerX-25, centerY-25, 50, 50)
        context.lineWidth = 5;
        context.strokeStyle = '#003300';
        context.stroke();
     </script>
    </body>
      
</html>

我的 canvas 有这个:

在点击正方形外但仍在圆圈内的区域后,我只想将那部分遮蔽起来,并得到类似这样的东西:

您可以使用 "evenodd" 填充规则简单地调用 fill()

但是,这会覆盖你当前笔画的内半部分,为了避免这种情况,你可以使用compositing在当前图形后面绘制:

const canvas = document.getElementById('myCanvas');
const context = canvas.getContext('2d');
const centerX = canvas.width / 2;
const centerY = canvas.height / 2;
const radius = 70;

context.beginPath();
context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);

context.rect(centerX-25, centerY-25, 50, 50)
context.lineWidth = 5;
context.strokeStyle = '#003300';
context.stroke();
context.fillStyle = "green";

canvas.onclick = ({ clientX, clientY }) => {
  const { left, top } = canvas.getBoundingClientRect();
  // if we're in the circle but not the inner rect
  if( context.isPointInPath( clientX - left, clientY - top, "evenodd" ) ) {
    // draw behind
    context.globalCompositeOperation = "destination-over";
    context.fill("evenodd");
    // do it only once
    canvas.onclick = null;
  }
};
<canvas width="300" height="300" id="myCanvas" style="border:1px solid #000000;"></canvas>