微信小程序实现环形进度条

 更新时间:2022年06月30日 08:46:51   作者:逃离到火星  
这篇文章主要为大家详细介绍了微信小程序实现环形进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了微信小程序实现环形进度条的具体代码,供大家参考,具体内容如下

index.wxss

.circle {
  position: absolute;
  left: 0;
  right: 0;
  margin: auto;
}

index.wxml

<canvas class="circle" style="z-index: 1;" canvas-id="canvasArcCir"></canvas>
<canvas class="circle" style="z-index: 0;" canvas-id="canvasCircle"></canvas>

index.js

var interval;
var varName;
var ctx = wx.createCanvasContext('canvasArcCir');


Page({

  /**
   * 页面的初始数据
   */
  data: {
    pitch: 0,
    titleName: "答题结果",
    btn_color: "",
    text: 0,
    accuracy: {},
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    if (options.correctAndError != null) {
      var accuracyTemp = JSON.parse(options.correctAndError);
      accuracyTemp.time = (accuracyTemp.time / 2).toFixed(1);
    } else {
      var accuracyTemp = {
        questionNumber: 10,
        correctNumber: 7,
        time: 50
      }
    }

    var bgColorTemp = "";
    var bColorTemp = "";
    if ((accuracyTemp.correctNumber / accuracyTemp.questionNumber) < 0.6) {
      bgColorTemp = "linear-gradient(180deg,rgba(255,90,84,1) 0%,rgba(255,152,109,1) 100%)";
      bColorTemp = "#FF5C54"
    } else if ((accuracyTemp.correctNumber / accuracyTemp.questionNumber) < 0.8) {
      bgColorTemp = "linear-gradient(180deg,rgba(250,182,25,1) 0%,rgba(249,206,69,1) 100%)";
      bColorTemp = "#FBC932";
    } else {
      bgColorTemp = "linear-gradient(180deg,rgba(53,168,203,1) 0%,rgba(80,205,219,1) 100%)";
      bColorTemp = "#36A9CB";
    }

    //练习结果-差
    this.setData({
      bgColor: bgColorTemp,
      btBgColor: bgColorTemp,
      tColor: bColorTemp,
      bdColor: bColorTemp,
      accuracy: accuracyTemp
    });
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
    var that = this;
    setTimeout(function () {


      //创建并返回绘图上下文context对象。
      //灰色圆环
      var cxt_arc = wx.createCanvasContext('canvasCircle');
      cxt_arc.setLineWidth(15);
      cxt_arc.setStrokeStyle('#eaeaea');
      cxt_arc.setLineCap('round');
      cxt_arc.beginPath();
      cxt_arc.arc(130, 130, 94, 2.5, 2.2 * Math.PI, false);
      cxt_arc.stroke();
      
      
      //没有运动的白点
      cxt_arc.beginPath();
      cxt_arc.setStrokeStyle('#fff');
      cxt_arc.setLineCap('round');
      cxt_arc.setLineWidth(5);
      cxt_arc.arc(55, 185, 1, 0, 2 * Math.PI, false);
      cxt_arc.stroke();
      
      
      //虚线中的圆环
      var waste_pce = 20;
      cxt_arc.setLineWidth(18);
      cxt_arc.setStrokeStyle(that.data.tColor);
      cxt_arc.setLineCap('square')
      cxt_arc.beginPath(); //开始一个新的路径
      cxt_arc.arc(130, 130, 60, 2.5, 2.2 * Math.PI, false); //设置一个原点(106,106),半径为100的圆的路径到当前路径
      cxt_arc.stroke(); //对当前路径进行描边
      
      
      //画50条放射白线实现虚线效果
      cxt_arc.setLineWidth(3);
      cxt_arc.setStrokeStyle('#fff');
      cxt_arc.setLineCap('square');
      cxt_arc.beginPath(); //开始一个新的路径
      for (var i = 0; i < 50; i++) {
        var x = Math.PI * 2 / 50 * i;
        cxt_arc.moveTo(130, 130);
        cxt_arc.lineTo((130 + Math.sin(x) * 70), (130 + Math.cos(x) * 70));
        cxt_arc.stroke();
      }

      var accuracyTemp = (that.data.accuracy.correctNumber / that.data.accuracy.questionNumber)

      that.drawCircle(accuracyTemp, that.data.tColor);
      
      //设置中间字的坐标
      var x = 130,
        y = 130;
      if (accuracyTemp == 1) {
        x = 125;
        y = 158;
      } else if (accuracyTemp == 0) {
        x = 126;
        y = 140;
      } else {
        x = 126;
        y = 150;
      }
      
      //中间字 数字
      cxt_arc.beginPath();
      cxt_arc.setFontSize(30);
      cxt_arc.setFillStyle(that.data.tColor);
      cxt_arc.textAlign = 'center';
      cxt_arc.fillText(accuracyTemp * 100, x, 135);
      cxt_arc.stroke();
      
      //中间字 %
      cxt_arc.beginPath();
      cxt_arc.setFontSize(10);
      cxt_arc.fillText("%", y, 135);
      cxt_arc.textAlign = 'center';
      cxt_arc.stroke();
      
      //中间字 正确率
      cxt_arc.beginPath();
      cxt_arc.setFontSize(10);
      cxt_arc.setFillStyle("#999999");
      cxt_arc.textAlign = 'center';
      cxt_arc.fillText("正确率", 130, 155);
      cxt_arc.stroke();

      cxt_arc.draw();


    }, 500);
  },
  /**
   * 自定义函数
   */
  drawCircle: function (name, color) {
    this.setData({
      btn_color: color,
      text: name * 100
    })
    clearInterval(varName);

    function drawArc(s, e, x9, y9) {
      //运动环
      ctx.setFillStyle('white');
      ctx.clearRect(0, 0, 200, 200);
      ctx.draw();
      var x = 130,
        y = 130,
        radius = 94;
      ctx.setLineWidth(15);
      ctx.setStrokeStyle(color);
      ctx.setLineCap('round');
      ctx.beginPath();
      ctx.arc(x, y, radius, s, e, false);
      ctx.stroke()
      
      //运动白点
      ctx.beginPath();
      ctx.setStrokeStyle('#fff');
      ctx.setLineCap('round');
      ctx.setLineWidth(5);
      ctx.arc(x9, y9, 1, 0, 2 * Math.PI, false);
      ctx.stroke();
      ctx.draw()


    }
    var step = 0,
      startAngle = 0.8 * Math.PI,//开始弧度
      endAngle = 0;
    var animation_interval = 0,
      n = 600;


    var animation = function () {
      if (step <= n) {

        endAngle = name * (step * 1.4 * Math.PI / n) + 0.8 * Math.PI;//结束弧度
        var L = (1.2*Math.PI + endAngle )*94;//弧长
        var x = (54 - 130) * Math.cos(L / 94) - (185 - 130) * Math.sin(L / 94) + 130; //x坐标
        var y = (54 - 130) * Math.sin(L / 94) + (185 - 130) * Math.cos(L / 94) + 130; //y坐标

        drawArc(startAngle, endAngle, x, y);
        step++;
      } else {
        clearInterval(varName);
      }
    };
    varName = setInterval(animation, animation_interval);
  },

})

效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • javascript实现下拉提示选择框

    javascript实现下拉提示选择框

    这篇文章主要介绍了javascript实现下拉提示选择框的相关资料,需要的朋友可以参考下
    2015-12-12
  • js实现简单模态框实例

    js实现简单模态框实例

    这篇文章主要为大家详细介绍了js实现简单模态框实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 微信小程序开发之左右分栏效果的实例代码

    微信小程序开发之左右分栏效果的实例代码

    本文以一个简单的小例子,简述在微信小程序开发中左右分栏功能的实现方式,主要涉及scroll-view ,列表数据绑定,及简单样式等内容,感兴趣的朋友跟随小编一起看看吧
    2019-05-05
  • js控制iframe的高度/宽度让其自适应内容

    js控制iframe的高度/宽度让其自适应内容

    这篇文章主要介绍了如何使用js控制iframe的高度/宽度让其自适应内容,需要的朋友可以参考下
    2014-04-04
  • JavaScript编写猜拳游戏

    JavaScript编写猜拳游戏

    这篇文章主要为大家详细介绍了JavaScript编写猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • JS实现长图上下滚动效果

    JS实现长图上下滚动效果

    这篇文章主要为大家详细介绍了JS实现长图上下滚动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 浅谈javascript的Touch事件

    浅谈javascript的Touch事件

    在本文深入研究iOS和Android设备提供的触摸事件API,探索一下可以构建哪些类型的应用,给出一些最佳做法,并论及一些使得可触控应用(touch-enabled application)的开发变得更加容易的有用技术。
    2015-09-09
  • JavaScript数据类型和变量_动力节点Java学院整理

    JavaScript数据类型和变量_动力节点Java学院整理

    这篇文章主要为大家详细介绍了JavaScript数据类型和变量的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 微信小程序如何修改radio和checkbox的默认样式和图标

    微信小程序如何修改radio和checkbox的默认样式和图标

    这篇文章主要介绍了微信小程序修改radio和checkbox的默认样式和图标,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • javascript 数组使用方法汇总

    javascript 数组使用方法汇总

    由于javascript是一种无类型语言,所以一个数组的元素可以具有任意的数据类型,同一个数组的不同元素 可以具有不同的类型,数组的元素设置可以包含其他数组,这样就可以创建一个复杂的数组了.
    2009-12-12

最新评论