Rings.weapp.tsx 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { Canvas } from "@tarojs/components";
  2. import Taro, { useDidShow, useReady } from "@tarojs/taro";
  3. import { useEffect, useRef } from "react";
  4. export default function Rings(props: { strokeWidth: number; radius: number; color: string; canvasId?: string;bgColor?:string }) {
  5. const progress = 0.85
  6. const r = props.radius || 80
  7. const strokeWidth = props.strokeWidth || 10;
  8. const color = props.color || 'orange'
  9. const canvasRef = useRef(null);
  10. const canvasId = props.canvasId ? 'canvas_' + props.canvasId : 'progress-canvas';
  11. const dpr = Taro.getSystemInfoSync().pixelRatio; // 获取设备的像素比
  12. const radius = r; // 圆形进度条的半径
  13. const lineWidth = strokeWidth; // 圆形进度条的线宽
  14. useDidShow(() => {
  15. // drawCircle()
  16. })
  17. useReady(() => {
  18. drawCircle()
  19. })
  20. function drawCircle() {
  21. const query = Taro.createSelectorQuery();
  22. query.select(`.${canvasId}`).fields({ node: true, size: true });
  23. query.exec((res) => {
  24. const _canvas = res[0].node;
  25. _canvas.width = res[0].width * dpr;
  26. _canvas.height = res[0].height * dpr;
  27. const ctx = _canvas.getContext('2d');
  28. // const ctx = Taro.createCanvasContext(canvasId);
  29. const center = radius + lineWidth / 2; // 圆心坐标
  30. // 设置画布尺寸
  31. ctx.scale(dpr, dpr);
  32. // 绘制背景圆
  33. ctx.beginPath();
  34. ctx.arc(center, center, radius, 0, 2 * Math.PI);
  35. ctx.lineWidth = lineWidth;
  36. ctx.strokeStyle = 'lightgray';
  37. ctx.lineCap = 'round'; // 设置为圆角
  38. ctx.stroke();
  39. // 绘制进度圆
  40. ctx.beginPath();
  41. ctx.arc(center, center, radius, -Math.PI / 2 + 1, (2 * Math.PI * progress) - Math.PI / 2);
  42. ctx.lineWidth = lineWidth;
  43. ctx.strokeStyle = color;
  44. ctx.lineCap = 'round'; // 设置为圆角
  45. ctx.stroke();
  46. // ctx.draw();
  47. });
  48. }
  49. useEffect(() => {
  50. // const ctx = Taro.createCanvasContext(canvasId);
  51. // const center = radius + lineWidth / 2; // 圆心坐标
  52. // // 设置画布尺寸
  53. // ctx.scale(1 / dpr, 1 / dpr);
  54. // // 绘制背景圆
  55. // ctx.beginPath();
  56. // ctx.arc(center, center, radius, 0, 2 * Math.PI);
  57. // ctx.setLineWidth(lineWidth);
  58. // ctx.setStrokeStyle('lightgray');
  59. // ctx.setLineCap('round'); // 设置为圆角
  60. // ctx.stroke();
  61. // // 绘制进度圆
  62. // ctx.beginPath();
  63. // ctx.arc(center, center, radius, -Math.PI / 2 + 1, (2 * Math.PI * progress) - Math.PI / 2);
  64. // ctx.setLineWidth(lineWidth);
  65. // ctx.setStrokeStyle(color);
  66. // ctx.setLineCap('round'); // 设置为圆角
  67. // ctx.stroke();
  68. // ctx.draw();
  69. }, [progress]);
  70. return <Canvas canvasId={canvasId} id={canvasId} className={canvasId} type="2d" style={{ width: (radius * 2 + lineWidth), height: (radius * 2 + lineWidth), zIndex: 0 }} ref={canvasRef} />
  71. }