美文网首页Web 前端开发 让前端飞
用canvas画一个进度条为圆角的环形图(圆环图)

用canvas画一个进度条为圆角的环形图(圆环图)

作者: 虚拟J | 来源:发表于2019-11-25 13:48 被阅读0次

    之前用css画了环形图,但是进度条不能为圆角,和设计图有一点点不一样。现在有点时间,打算用canvas画个圆角的环形图。

    在用canvas画环形图的时候,思考比较久的是进度条百分比这一块。
    关键点是知道Math.PI 返回的是什么。PI就是圆周率π,PI是弧度制的π,也就是180°。所以,Math.PI ≈ 3.14 = 180°
    把下面的PI换成180°,一切就很简单了。(一开始没反应过来竟是小学内容。。。犹豫了一下才反应过来)

    效果图

    demo

    import React, { useEffect } from "react";
    import ReactDOM from "react-dom";
    
    //百分比
    let percent=0.7;
    function App() {
      useEffect(() => {
        const ctx = document.getElementById("myCanvas").getContext("2d");
        //外圆环
        ctx.beginPath();
        ctx.arc(100, 100, 50, 0, 2 * Math.PI);
        ctx.strokeStyle = "#fff";
        ctx.fillStyle = "#EDEDED";
        ctx.fill();
        ctx.stroke();
        //内圆环
        ctx.beginPath();
        ctx.arc(100, 100, 40, 0, 2 * Math.PI);
        ctx.strokeStyle = "#fff";
        ctx.fillStyle = "#fff";
        ctx.fill();
        ctx.stroke();
        //环形图的进度条
        ctx.beginPath();
        ctx.arc( 100,100, 44, -Math.PI / 2,-Math.PI / 2 + percent * (Math.PI * 2),false);
        ctx.lineWidth = 8;
        ctx.lineCap = "round";
        ctx.strokeStyle = "rgb(255, 127, 105)";
        ctx.stroke();
      });
    
      return (
        <div style={{textAlign: 'center',marginTop: '30%'}}>
          <canvas id="myCanvas" width="200" height="200" style={{border: "1px solid #000000" }}/>
       </div>
      );
    }
    
    const rootElement = document.getElementById("root");
    ReactDOM.render(<App />, rootElement);
    
    

    上面的代码,我在谷歌上运行,和在codesandbox中运行的结果不太一样。
    发现在谷歌上运行的时候,画外圆环和内圆环的线条宽度受到了画进度条时设置的lineWidth线条宽度的影响。所以在画外圆环和内圆环时,加一行ctx.lineWidth = 1的代码就可以了。

    相关文章

      网友评论

        本文标题:用canvas画一个进度条为圆角的环形图(圆环图)

        本文链接:https://www.haomeiwen.com/subject/cajqwctx.html