• 弧形进度条,弧形百分比


    要帮助同事写一个弧度的进度条,进度条顶部有一个小圆,具体如下

    需要指出的是,我们canvas的绘制是需要弧度,所以我们代码中使用角度,等待绘制的时候再砖话为弧度值

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>Documenttitle>
    7. head>
    8. <body>
    9. <div>
    10. <input type="range" id="cowbell" name="cowbell" min="0" max="100" value="50" step="1">
    11. <label for="cowbell">拖拽角度变化label>
    12. div>
    13. <canvas id="canvas">canvas>
    14. <script>
    15. const cowbell = document.getElementById("cowbell");
    16. cowbell.addEventListener("input", (a, c) => {
    17. console.log(cowbell.value)
    18. draw(cowbell.value)
    19. });
    20. let canvas = document.getElementById('canvas');
    21. let ctx = canvas.getContext('2d');
    22. canvas.width = 500;
    23. canvas.height = 500;
    24. let conterw = canvas.width / 2;//弧度的中心坐标
    25. let conterh = canvas.height / 2;//弧度的中心坐标
    26. let sAngle = 150;//其实角度
    27. let eAngle = 390;//结束角度
    28. let nAngle = 100;//以sAngle为基准的角度
    29. let leng = 100;//半径
    30. draw(50)
    31. //绘制百分比进度
    32. function draw(percentage) {
    33. //清空画布
    34. ctx.clearRect(0, 0, canvas.width, canvas.height);
    35. //结束角度 - 起始角度 = 中间区域的范围值
    36. //中间区域的范围值 / 100 *当前进度百分比
    37. //得到百分比下的角度值
    38. nAngle = (eAngle - sAngle) / 100 * percentage;
    39. //绘制一个弧度进度条底色
    40. drawArc(sAngle, eAngle, eAngle, conterw, conterh, '#e1e8ee')
    41. //绘制一个弧度有进度的
    42. drawArc(sAngle, eAngle, nAngle, conterw, conterh, '#6f78cc')
    43. //绘制圆的坐标
    44. let { x, y } = getArcFillXY(sAngle, eAngle, leng, conterw, conterh, nAngle)
    45. //绘制圆
    46. drawArcFill(x, y);
    47. }
    48. //绘制弧度
    49. function drawArc(sAngle, eAngle, nAngle, conterw, conterh, strokeStyle = '#e1e8ee') {
    50. ctx.beginPath();
    51. //在基础sAngle上加上差量的角度
    52. nAngle += sAngle;
    53. //控制最小的角度
    54. if (sAngle > nAngle) {
    55. nAngle = sAngle;
    56. }
    57. // 控制最大的角度
    58. if (eAngle < nAngle) {
    59. nAngle = eAngle;
    60. }
    61. //绘制角度
    62. ctx.arc(conterw, conterh, leng, rad(sAngle), rad(nAngle), false);
    63. ctx.strokeStyle = strokeStyle;
    64. ctx.lineWidth = 5;
    65. ctx.stroke();
    66. ctx.closePath();
    67. }
    68. function drawArcFill(x, y) {
    69. //绘制一个半径为5得红色圆形
    70. ctx.beginPath();
    71. ctx.arc(x, y, 5, 0, 2 * Math.PI, false);
    72. ctx.fillStyle = 'red';
    73. ctx.fill();
    74. ctx.closePath();
    75. }
    76. //将上述的圆形放在进度条的头部,随着弧形的角度一起变化
    77. /**
    78. *
    79. */
    80. function getArcFillXY(sAngle, eAngle, leng, conterw, conterh, nAngle) {
    81. //半径是
    82. let x = conterw - leng;
    83. let y = conterh;
    84. //在基础sAngle上加上差量的角度
    85. nAngle += sAngle
    86. //控制最小的角度
    87. if (sAngle > nAngle) {
    88. nAngle = sAngle;
    89. }
    90. // 控制最大的角度
    91. if (eAngle < nAngle) {
    92. nAngle = eAngle;
    93. }
    94. //差值角度
    95. let cAngle = nAngle - sAngle;
    96. x = Math.cos(rad(nAngle)) * leng + conterw;
    97. y = Math.sin(rad(nAngle)) * leng + conterh;
    98. return {
    99. x, y
    100. }
    101. }
    102. //度数转化为弧度得方法
    103. function rad(sAngle) {
    104. return sAngle * Math.PI / 180;
    105. }
    106. script>
    107. body>
    108. html>

  • 相关阅读:
    26.原子类操作类
    AGC电路,模拟乘法器
    CentOS网络设置
    【无标题】
    SAP从放弃到入门系列之MRP中BOM的选择逻辑
    使用 Python 和 AI 将自己卡通化VToonify(教程含源码)
    记录一次内存泄漏排查过程
    threejs: layers实现图层的显示隐藏切换
    MongoDB从入门到精通、Springboot整合MongoDB
    第十三届蓝桥杯省赛Java A 组 F 题、Python A 组 G 题、Python B 组 G题——全排列的价值 (AC)
  • 原文地址:https://blog.csdn.net/huhudeni/article/details/133750994