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();
  }
}
相关推荐
小满zs1 分钟前
Zustand 第三章(状态简化)
前端·react.js
普宁彭于晏3 分钟前
元素水平垂直居中的方法
前端·css·笔记·css3
恋猫de小郭14 分钟前
为什么跨平台框架可以适配鸿蒙,它们的技术原理是什么?
android·前端·flutter
云浪18 分钟前
元素变形记:CSS 缩放函数全指南
前端·css
明似水33 分钟前
用 Melos 解决 Flutter Monorepo 的依赖冲突:一个真实案例
前端·javascript·flutter
独立开阀者_FwtCoder42 分钟前
stagewise:让AI与代码编辑器无缝连接
前端·javascript·github
清沫44 分钟前
Cursor Rules 开发实践指南
前端·ai编程·cursor
江城开朗的豌豆1 小时前
JavaScript篇:对象派 vs 过程派:编程江湖的两种武功心法
前端·javascript·面试
不吃糖葫芦31 小时前
App使用webview套壳引入h5(二)—— app内访问h5,顶部被手机顶部菜单遮挡问题,保留顶部安全距离
前端·webview
菥菥爱嘻嘻1 小时前
JS手写代码篇---手写ajax
开发语言·javascript·ajax