canvas画两个相交的圆(React)

需求:展示两个模块及交集,以两个圆相交的方式,如下图:

一开始画,总会一个圆压住另一个圆,最后看到了paper.js,就可以了,好用,center是圆心,第一个值是X轴坐标,第二个值是Y轴坐标;radius是半径;fillColor是填充色。一看代码就能看懂啦~

哈哈哈,记录一下。

组件canvasBox.js

import React, { useEffect, useRef } from 'react';
import PropTypes from 'prop-types';
import paper from 'paper';
import './style.less';

const CanvasBox = props => {
  const {
    canvasData: {
      aClueSource, aMedia, clueNumA, independentNumA,
      bClueSource, bMedia, clueNumB, independentNumB,
      pNum,
    },
  } = props;

  const canvasRef = useRef(null);

  useEffect(() => {
    const canvas = canvasRef.current;
    paper.setup(canvas);
    // 创建两个圆
    const circle1 = new paper.Path.Circle({
      center: [196, 200],
      radius: 174,
      fillColor: '#81d3f8',
    });

    const circle2 = new paper.Path.Circle({
      center: [396, 200],
      radius: 184,
      fillColor: '#80ffff',
    });
    // 检测相交
    const intersection = circle1.intersect(circle2);
    if (intersection) {
      intersection.fillColor = '#c280ff';
    } else {
      console.log('Circles do not intersect');
    }
    return () => {
      // Clean up Paper.js environment if component unmounts
      paper.project.clear();
    };
  }, []);

  return (
    <div className="h-canvas-box">

      // 以绝对定位的方式,固定在两圆相交的部分
      <div className="hcb-label">重复号码量:{pNum}</div>

      // 左边部分
      <div className="hcb-a-div">
        <div style={{ fontWeight: 600 }}>{aClueSource}-{aMedia}</div>
        <div>线索量:{clueNumA}</div>
        <div>电话号码量:{independentNumA}</div>
      </div>

      // 两个相交圆部分
      <canvas ref={canvasRef} style={{ width: '100%', height: '100%' }} />

      // 右边部分
      <div className="hcb-b-div">
        <div style={{ fontWeight: 600 }}>{bClueSource}-{bMedia}</div>
        <div>线索量:{clueNumB}</div>
        <div>电话号码量:{independentNumB}</div>
      </div>
    </div>
  );
};

CanvasBox.propTypes = {
  canvasData: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
};

export default React.memo(CanvasBox);

组件style.less

 .h-canvas-box{
    position: relative;
    height: 400px;
    position: relative;

    .hcb-a-div{
      position: absolute;
      top: 45%;
      left: -200px;
      width: 200px;
      display: inline-block;
      text-align: right;
    }

    .hcb-label{
      position: absolute;
      top: 48%;
      left: 240px;
      color: #fff;
      z-index: 99;
    }

    .hcb-b-div{
      position: absolute;
      width: 200px;
      top: 45%;
      left: 600px;
      display: inline-block;
      text-align: left;
    }

  }

使用:

import CanvasBox from '../components/canvasBox';

<CanvasBox
    canvasData={{
        aClueSource: '',
        aMedia: '',
        clueNumA: '',
        independentNumA: '',
        bClueSource: '',
        bMedia: '',
        clueNumB: '',
        independentNumB: '',
        pNum: '',
    }}
/>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常好的问题!我很乐意为您提供帮助。以下是代码示例: HTML: ``` <canvas id="canvas" width="200" height="200"></canvas> ``` JavaScript: ``` // 设置倒计时总时间 const totalTime = 60; // 获取canvas元素 const canvas = document.getElementById('canvas'); // 获取绘图环境 const ctx = canvas.getContext('2d'); // 获取canvas的中心点 const centerX = canvas.width / 2; const centerY = canvas.height / 2; // 设置环的半径和宽度 const radius = 70; const lineWidth = 10; // 设置倒计时剩余时间的初始值为总时间 let remainingTime = totalTime; // 开始绘制环 function drawCircle() { // 计算环的结束角度 const endAngle = (2 * Math.PI * remainingTime) / totalTime - 0.5 * Math.PI; // 绘制环的背景 ctx.beginPath(); ctx.arc(centerX, centerY, radius, 0, 2 * Math.PI); ctx.lineWidth = lineWidth; ctx.strokeStyle = '#ccc'; ctx.stroke(); // 绘制环的进度 ctx.beginPath(); ctx.arc(centerX, centerY, radius, -0.5 * Math.PI, endAngle); ctx.lineWidth = lineWidth; ctx.strokeStyle = '#f00'; ctx.stroke(); // 绘制倒计时的文本 ctx.fillStyle = '#000'; ctx.font = '30px Arial'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle' ctx.fillText(remainingTime, centerX, centerY); } // 开始倒计时 function startCountdown() { // 每秒更新倒计时剩余时间并重新绘制环 setInterval(() => { remainingTime--; ctx.clearRect(0, 0, canvas.width, canvas.height); drawCircle(); }, 1000); } // 调用开始倒计时的函数 startCountdown(); ``` 代码说明: 首先,在 HTML 中创建一个 canvas 元素,并分配 ID 为“canvas”。然后,在 JavaScript 文件中,使用 `document.getElementById()` 方法获取 canvas 元素,并使用 `getContext()` 方法获取 2D 绘图环境。接下来,设置环的半径和宽度,还有倒计时的总时间和初始值。然后,定义 `drawCircle()` 函数用于绘制环和倒计时文本,其中通过 `beginPath()` 和 `arc()` 方法绘制环,通过 `stroke()` 方法显示环,通过 `fillText()` 方法显示倒计时文本。最后,定义 `startCountdown()` 函数用于开始倒计时,使用 `setInterval()` 方法每秒更新倒计时剩余时间并重新绘制环。 希望这个例子能够帮助您实现一个环倒计时的功能!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值