• 在vue中使用canvas画多色圆环


    组件 cavas

    <template>
      <div class="count-wrap" :style="{width+'px',height:height+'px', position: 'relative'}">
        <canvas :id="canvaId" :width="width" :height="height"></canvas>
      </div>
    </template>
    <script>
    export default {
      name: "cavas",
      props: {
         {
          type: Number,
          default: 300
        },
        height: {
          type: Number,
          default: 300
        },
        canvaId: {
          type: String,
          default: "canvasId"
        },
        config: {
          type: Object,
          default: {}
        }
      },
      data() {
        return {};
      },
      mounted() {
        var timeCanvas = document.getElementById(this.canvaId);
        this.drawMain(timeCanvas, this.config);
      },
      methods: {
        drawMain(drawingElem, config = {}) {
          config = Object.assign(
            {},
            { bgcolor: "#eee", lineWidth: 20, data: [], colorList: [],lineCap:'butt' },
            config
          );
          var context = drawingElem.getContext("2d");
          var centerX = drawingElem.width / 2;
          var centerY = drawingElem.height / 2;
          var rad = (Math.PI * 2) / 100;//总的角度分配到100里面
    
          function backgroundCircle() {
            context.save();
            context.beginPath();
            context.lineWidth = config.lineWidth;
            var radius = centerX - context.lineWidth;//设置半径
            context.lineCap = "round";//设置或返回线条末端线帽的样式。
            context.strokeStyle = config.bgcolor;//设置线颜色
           //
    x    圆的中心的 x 坐标。
    y    圆的中心的 y 坐标。
    r    圆的半径。
    sAngle    起始角,以弧度计。(弧的圆形的三点钟位置是 0 度)。
    eAngle    结束角,以弧度计。
    counterclockwise    可选。规定应该逆时针还是顺时针绘图。False = 顺时针,true = 逆时针。
                   //
            context.arc(centerX, centerY, radius, 0, Math.PI * 2, false);//画圆线
            context.stroke();//绘制已定义的路径
            context.closePath();
            context.restore();//返回之前保存过的路径状态和属性
          }
          function foregroundCircle(start, end, color) {
            context.save();
            context.strokeStyle = color;
            if (color === "#eee") {
              context.lineWidth = 0;
            } else {
              context.lineWidth = config.lineWidth;
            }
            context.lineCap = config.lineCap;
            var radius = centerX - context.lineWidth;
            context.beginPath();
            context.arc(centerX, centerY, radius, start, end, false);
            context.stroke();
            context.closePath();
            context.restore();
          }
          backgroundCircle();
         //画每段圆环
          let radArr = [];
          config.data.forEach((item, index) => {
            radArr[index] =
              -Math.PI / 2 +
              (item + (index == 0 ? 0 : config.data[index - 1])) * rad;
            foregroundCircle(
              index == 0 ? -Math.PI / 2 : radArr[index - 1],
              radArr[index],
              config.colorList[index]
            );
          });
        }
      }
    };
    </script>
    <style lang="less" scoped>
    .count-wrap {
      #time-graph-canvas {
         100%;
        height: 100%;
        position: absolute;
        top: 0;
      }
    }
    </style>

    调用组件

  • 相关阅读:
    Express本地测试HTTPS
    在 WebStorm 中,配置能够识别 Vue CLI 3 创建的项目的别名 alias
    在线版本的ps
    功能强大的任务日历组件
    tree-shaking实战
    深入diff 算法
    【题解】[SHOI2001] Panda 的烦恼
    【题解】[JLOI2011]不重复数字
    「Codeforces Global Round #10」赛后个人总结
    【题解】[SCOI2004] 文本的输入
  • 原文地址:https://www.cnblogs.com/lzq035/p/14078164.html
Copyright © 2020-2023  润新知