canvas 自定义百分比画圈

如果你需要下面这样的圆

和这样的圆

下面的代码可以 你可以开箱即用(vue2.x), 当然其它的需要技术栈需要你适当优化一下

html 复制代码
<canvas id="circle" height="148px" width="148px"></canvas>
js 复制代码
// 执行
this.circle(80,'#67C23A','#F2F6FC','#67C23A')

// 方法
circle(percentData,textColor,backgroundCircleColor,circleColor) {
  var canvas = document.getElementById('circle');
  var ctx = canvas.getContext("2d");
  let percent = percentData
  /*填充文字*/
  ctx.font = "bold 18px Microsoft YaHei";
  /*文字颜色*/
  ctx.fillStyle = textColor;
  /*文字内容*/
  var insertContent = '';
  // var text = ctx.measureText(insertContent);
  /*插入文字,后面两个参数为文字的位置*/
  /*此处注意:text.width获得文字的宽度,然后就能计算出文字居中需要的x值*/
  // ctx.fillText(insertContent, (132 - text.width) / 2, 68);
  /*填充百分比*/
  var ratioStr = percent + '%';
  var text = ctx.measureText(ratioStr);
  ctx.fillText(ratioStr, (148 - text.width) / 2, 83);
  /*开始圆环*/
  var circleObj = {
    ctx: ctx,
    /*圆心*/
    x: 74,
    y: 74,
    /*半径*/
    radius: 62,
    /*环的宽度*/
    lineWidth: 22
  }
  /*灰色的圆环*/
  /*开始的度数-从上一个结束的位置开始*/
  circleObj.startAngle = 0;
  /*结束的度数*/
  circleObj.endAngle = Math.PI * 2;
  circleObj.color = backgroundCircleColor;
  circleObj.lineWidth = 22;
  this.drawCircle(circleObj,2);
  /*有色的圆环*/
  /*从-90度的地方开始画*/
  circleObj.startAngle = - Math.PI * 2 * 90 / 360;
  /*从当前度数减去-90度*/
  circleObj.endAngle = Math.PI * 2 * (percent / 100 - 0.25);
  circleObj.color = circleColor;
  circleObj.lineWidth = 22; // 确保这里与灰色圆环的宽度一致
  if(percent !=0) {
    this.drawCircle(circleObj,1);
  }
},
/*画曲线*/
drawCircle(circleObj,type) {
  var ctx = circleObj.ctx;
  if(type==1){
    ctx.beginPath();
    // 绘制圆形路径,参数:x, y, 半径,起始角度,结束角度,顺时针/逆时针
    ctx.arc(circleObj.x, circleObj.y, circleObj.radius, circleObj.startAngle, circleObj.endAngle, false);
    //设定曲线粗细度
    ctx.lineWidth = circleObj.lineWidth;
    //给曲线着色
    ctx.strokeStyle = circleObj.color;
    //连接处样式,保证红色圆环有圆角效果
    ctx.lineCap = 'round'
    //给环着色
    ctx.stroke();
    ctx.closePath();
  }else if(type==2){
    // 开始一个新的路径
    ctx.beginPath();
    // 绘制圆形路径,参数:x, y, 半径,起始角度,结束角度,顺时针/逆时针
    ctx.arc(circleObj.x, circleObj.y, circleObj.radius, circleObj.startAngle, circleObj.endAngle);
    ctx.lineWidth = circleObj.lineWidth;
    ctx.strokeStyle = circleObj.color
    ctx.stroke();
  }
}
相关推荐
代码猎人2 分钟前
forEach和map方法有哪些区别
前端
恋猫de小郭3 分钟前
Google DeepMind :RAG 已死,无限上下文是伪命题?RLM 如何用“代码思维”终结 AI 的记忆焦虑
前端·flutter·ai编程
byzh_rc11 分钟前
[微机原理与系统设计-从入门到入土] 微型计算机基础
开发语言·javascript·ecmascript
m0_4711996311 分钟前
【小程序】订单数据缓存 以及针对海量库存数据的 懒加载+数据分片 的具体实现方式
前端·vue.js·小程序
编程大师哥12 分钟前
Java web
java·开发语言·前端
A小码哥14 分钟前
Vibe Coding 提示词优化的四个实战策略
前端
Murrays14 分钟前
【React】01 初识 React
前端·javascript·react.js
大喜xi17 分钟前
ReactNative 使用百分比宽度时,aspectRatio 在某些情况下无法正确推断出高度,导致图片高度为 0,从而无法显示
前端
helloCat18 分钟前
你的前端代码应该怎么写
前端·javascript·架构
电商API_1800790524718 分钟前
大麦网API实战指南:关键字搜索与详情数据获取全解析
java·大数据·前端·人工智能·spring·网络爬虫