当前位置:   article > 正文

canvas实现环形图 uni-app(含渐变,数据流形式)_uniapp环形图

uniapp环形图

基本参数

 

普通环形图

实现效果

 实现流程

1.通过标签给出canvas宽高,绑定canvas-id一会根据这个进行生成

<canvas class="progress_bg" canvas-id="cpbg"></canvas>

2.页面挂载调用方法进行环形图渲染

下方ctx.beginPath()开辟新路径前后共生成两个环形图,第一个代表下方灰色,第二个代表蓝色

  1. var ctx = uni.createCanvasContext('cpbg', this);
  2. let end = (50 / 100 ) * 2 * Math.PI; //设置弧度
  3. console.log(end);
  4. ctx.setLineWidth(12); // 设置圆环的宽度
  5. ctx.arc(185, 80, 40, 0, 2 * Math.PI)
  6. ctx.setStrokeStyle('#f2f2f2');
  7. ctx.stroke(); //对当前路径进行描边
  8. // ctx.setLineCap('square'); // 设置圆环端点的形状 无圆角
  9. ctx.beginPath(); //开始一个新的路径
  10. ctx.setStrokeStyle('#0079fe'); // 设置圆环的颜色
  11. ctx.setLineCap('round'); // 设置圆环端点的形状 圆角
  12. ctx.arc(185, 80, 40, 0, end, false);
  13. ctx.stroke(); //对当前路径进行描边
  14. //设置一个原点(110,110),半径为100的圆的路径到当前路径
  15. ctx.stroke(); //对当前路径进行描边
  16. ctx.draw();

渐变环形图

效果

代码

  1. var ctx = uni.createCanvasContext('cpbar', this);
  2. // 进度条的渐变(中心x坐标-半径-边宽,中心Y坐标,中心x坐标+半径+边宽,中心Y坐标)
  3. var gradient = ctx.createLinearGradient(0, 0, 150, 0);
  4. let increase = 0.05;
  5. let end = (50 / 100) * 2 * Math.PI - Math.PI / 2; // 最后的角度
  6. let current = -Math.PI / 2; // 起始角度
  7. let timer = setInterval(() => {
  8. gradient.addColorStop('0', '#00F2FE'); //渐变颜色
  9. gradient.addColorStop('1.0', '#0079fe'); //渐变颜色
  10. // 圆弧粗度
  11. ctx.setLineWidth(12);
  12. ctx.setStrokeStyle(gradient);
  13. ctx.setLineCap('square');
  14. ctx.beginPath();
  15. // 参数step 为绘制的百分比
  16. if (current < end) {
  17. current = current + increase;
  18. }
  19. if (current >= end) {
  20. current = end;
  21. clearInterval(timer);
  22. }
  23. ctx.arc(85, 65, 40, -Math.PI / 2, current, false);
  24. ctx.stroke();
  25. ctx.draw();
  26. }, 20);

数据流环形图

效果

代码

 

  1. <view class="progress_box">
  2. <canvas class="progress_bg" canvas-id="cpbg"></canvas>
  3. <canvas class="progress_bar" canvas-id="cpbar"></canvas>
  4. <canvas class="progress_line" canvas-id="cpline"></canvas>
  5. <view class="progress_txt">
  6. <view class="progress_info">{{ progress_txt }}%</view>
  7. <view class="pcds">正确率</view>
  8. </view>
  9. </view>
  1. mounted: function() {
  2. this.drawProgressbg();
  3. this.drawCircle(this.progress_txt); //参数为1-100
  4. this.drawLine();
  5. },
  6. methods: {
  7. drawProgressbg: function() {
  8. // 自定义组件实例 this ,表示在这个自定义组件下查找拥有 canvas-id 的 <canvas/>
  9. var ctx = uni.createCanvasContext('cpbg', this);
  10. ctx.setLineWidth(12); // 设置圆环的宽度
  11. ctx.setStrokeStyle('#E9E9E9'); // 设置圆环的颜色
  12. // ctx.setLineCap('round'); // 设置圆环端点的形状
  13. ctx.setLineCap('square'); // 设置圆环端点的形状
  14. ctx.beginPath(); //开始一个新的路径
  15. ctx.arc(85, 65, 40, 0 * Math.PI, 2 * Math.PI, false);
  16. //设置一个原点(110,110),半径为100的圆的路径到当前路径
  17. ctx.stroke(); //对当前路径进行描边
  18. ctx.draw();
  19. },
  20. drawCircle: function(step) {
  21. var ctx = uni.createCanvasContext('cpbar', this);
  22. // 进度条的渐变(中心x坐标-半径-边宽,中心Y坐标,中心x坐标+半径+边宽,中心Y坐标)
  23. var gradient = ctx.createLinearGradient(0, 0, 130, 0);
  24. let increase = 0.05;
  25. let end = (step / 100) * 2 * Math.PI - Math.PI / 2; // 最后的角度
  26. let current = -Math.PI / 2; // 起始角度
  27. let timer = setInterval(() => {
  28. gradient.addColorStop('0', '#00F2FE');
  29. gradient.addColorStop('1.0', '#4FACFE');
  30. ctx.setLineWidth(12);
  31. ctx.setStrokeStyle(gradient);
  32. ctx.setLineCap('square');
  33. ctx.beginPath();
  34. // 参数step 为绘制的百分比
  35. if (current < end) {
  36. current = current + increase;
  37. }
  38. if (current >= end) {
  39. current = end;
  40. clearInterval(timer);
  41. }
  42. ctx.arc(85, 65, 40, -Math.PI / 2, current, false);
  43. ctx.stroke();
  44. ctx.draw();
  45. }, 20);
  46. },
  47. // 画刻度
  48. drawLine() {
  49. var context = uni.createCanvasContext("cpline", this);
  50. var r = 40;
  51. var x0 = 85;
  52. var y0 = 65;
  53. var x;
  54. var y;
  55. var lineWidth = 12;
  56. for (let i = 0; i < 60; i++) {
  57. context.beginPath();
  58. context.setLineWidth(lineWidth);
  59. context.setStrokeStyle("#FFFFFF");
  60. x = x0 - r * Math.sin(((6 * (i + 1) - 3) * Math.PI) / 180);
  61. y = y0 - r * Math.cos(((6 * (i + 1) - 3) * Math.PI) / 180);
  62. // console.log('x0:' + x0 + ' y0:' + y0 + ' x:' + x + ' y:' + y);
  63. context.moveTo(x, y);
  64. context.arc(
  65. x0,
  66. y0,
  67. r,
  68. ((270 - 6 * (i + 1) + 3) * Math.PI) / 180,
  69. ((270 - 6 * i) * Math.PI) / 180,
  70. false
  71. );
  72. context.stroke();
  73. context.closePath();
  74. }
  75. context.stroke();
  76. context.draw();
  77. },
  78. }
  1. .progress_box {
  2. /* position: relative; */
  3. /* width: 100%; */
  4. height: 200upx;
  5. /* background-color: red; */
  6. display: inline-block;
  7. align-items: center;
  8. justify-content: center;
  9. text-align: center;
  10. }
  11. .pcds {
  12. margin-top: 90rpx;
  13. color: black;
  14. }
  15. .progress_bg {
  16. position: absolute;
  17. width: 150px;
  18. height: 150px;
  19. }
  20. .progress_txt {
  21. position: absolute;
  22. font-size: 28upx;
  23. margin-top: 85rpx;
  24. margin-left: 95rpx;
  25. color: #999999;
  26. }
  27. .progress_bar {
  28. position: absolute;
  29. width: 220px;
  30. height: 220px;
  31. }
  32. .progress_line {
  33. position: absolute;
  34. width: 220px;
  35. height: 220px;
  36. }
  37. .progress_info {
  38. font-size: 36upx;
  39. padding-left: 16upx;
  40. letter-spacing: 2upx;
  41. font-size: 45upx;
  42. color: #333333;
  43. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/254330
推荐阅读
相关标签
  

闽ICP备14008679号