useCanvasApi.ts 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. const useCanvasApi = (size: number, radius: number) => {
  2. const pi = Math.PI;
  3. const onDraw = (
  4. ctx: CanvasRenderingContext2D,
  5. x: number,
  6. y: number,
  7. operator: "clip" | "fill"
  8. ) => {
  9. ctx.beginPath();
  10. ctx.moveTo(x, y);
  11. ctx.arc(x + size / 2, y - radius + 2, radius, 0.72 * pi, 2.26 * pi);
  12. ctx.lineTo(x + size, y);
  13. ctx.arc(x + size + radius - 2, y + size / 2, radius, 1.21 * pi, 2.78 * pi);
  14. ctx.lineTo(x + size, y + size);
  15. ctx.lineTo(x, y + size);
  16. ctx.arc(
  17. x + radius - 2,
  18. y + size / 2,
  19. radius + 0.4,
  20. 2.76 * pi,
  21. 1.24 * pi,
  22. true
  23. );
  24. ctx.lineTo(x, y);
  25. ctx.lineWidth = 2;
  26. ctx.fillStyle = "rgba(255, 255, 255, .5)";
  27. ctx.strokeStyle = "rgba(255, 255, 255, .5)";
  28. // 制造阴影
  29. if (operator === "clip") {
  30. ctx.shadowOffsetX = 2;
  31. ctx.shadowOffsetY = 2;
  32. ctx.shadowBlur = 2;
  33. ctx.shadowColor = "rgba(255, 255, 255, .6)";
  34. }
  35. ctx.stroke();
  36. ctx[operator]();
  37. ctx.globalCompositeOperation = "destination-over";
  38. };
  39. return { onDraw };
  40. };
  41. export default useCanvasApi;