小程序进度条_小程序杂技谈之环形进度条

本文介绍了如何在小程序中利用canvas2d绘制环形进度条。详细讲述了代码逻辑,包括初始化数据、设置圆弧颜色、增加和减少进度的函数等,提供了一种实现动态环形进度条的方法。
摘要由CSDN通过智能技术生成
737b0bfc18a8d75f750ab46d201b49e5.png

环形进

度条

03500bdad94be6996a84ed27a6afef3e.png

秋季出行

06c5523ec397d4988dc6b8be531d883c.png

老规矩,效果展示:

49416cc1a683f2c857e31d8456310994.gif

60e423cf635bab3a1b40bf79fd722300.png d04567fe53723d2ee126dd906400d315.png

看效果,我们决定用小程序的canvas2d进行绘画

小程序官方推荐使用canvas2d并且在onReady进行使用

65fbfba9f8aac7d7064b600a14f2cf59.png 982445387da67f21e3e68ff0ee7068b1.png 3d2b7638bfb810f6c510b0c285b72e6c.png df2ee6360bcff379f6c9c7727400eac8.png 46c9b8b3-982a-eb11-8da9-e4434bdf6706.svg

先看布局

48c9b8b3-982a-eb11-8da9-e4434bdf6706.svg e13d00b51416e76d147f0befa30fc25f.png 075eab60036665f371c75bb572e30477.png

      {{c_val}}

      {{tv_name}}

    增加

    减少

2653aee2d0d31af40bb4486fcbd3450b.png 4feaaace34d6bb66213245c7eb0d0101.png e932db48bb2e4425948bd065a2e43de3.png 88430525e4f9b8d57519196d8bbfc986.png ef82b403d8f7b485c13a4cc8ff5e0a57.png 75c9b8b3-982a-eb11-8da9-e4434bdf6706.svg

代码逻辑

77c9b8b3-982a-eb11-8da9-e4434bdf6706.svg e13d00b51416e76d147f0befa30fc25f.png 075eab60036665f371c75bb572e30477.png

然后我们在.js文件中编写代码逻辑

初始化数据

var startDegree = 210; //从什么角度开始

var maxValue = 100; //最大值

var minValue = 0; //最小值

var lineWidth = 6; //线条宽度

var circle_r;

var ctx ;

var canvas;

let winWidth;

/**

   * 页面的初始数据

   */

  data: {

    time: ''

  },

在onReady中进行初始化绑定

 /**

   * 生命周期函数--监听页面初次渲染完成

   */

  onReady: function () {

    this.setData({

      c_val: 0,

      tv_name: "展示分数"

    })

    const query = wx.createSelectorQuery()

    query.select('#canvasring')

      .fields({

        node: true,

        size: true

      })

      .exec((res) => {

        canvas = res[0].node

        ctx = canvas.getContext('2d')

        const dpr = wx.getSystemInfoSync().pixelRatio

        canvas.width = res[0].width * dpr

        canvas.height = res[0].height * dpr

        ctx.scale(dpr, dpr)

        winWidth = wx.getSystemInfoSync().windowWidth;

        circle_r = winWidth / 750 * 300 / 2; //画布的一半,用来找中心点和半径

        //定义起始点

        ctx.translate(circle_r, circle_r);

        // var value = this.data.c_val; //当前的值

        // var lineColor = "#393"; //线条颜色

        var percent = 300 * ((this.data.c_val - minValue) / (maxValue - minValue)); //计算结果

        this.showCircle(ctx,circle_r,startDegree,lineWidth,percent)

      })

  },

showCircle(ctx,circle_r,startDegree,lineWidth,percent) {

    var linearGradient;

    ctx.clearRect(-circle_r, -circle_r, canvas.width, canvas.height)

    //灰色圆弧

    ctx.beginPath();

    ctx.strokeStyle = "#ebebeb"

    ctx.lineCap = 'round'

    ctx.lineWidth = lineWidth

    ctx.arc(0, 0, circle_r - 10, startDegree * Math.PI / 180 - 0.5 * Math.PI,

      300 * Math.PI / 180 + startDegree * Math.PI / 180 - 0.5 * Math.PI, false);

    ctx.stroke();

    ctx.closePath();

    //有色彩的圆弧

    ctx.beginPath();

    linearGradient = ctx.createLinearGradient(

      -Math.sin((30) * Math.PI / 180) * (circle_r - 10),

      Math.cos((30) * Math.PI / 180) * (circle_r - 10),

      -Math.sin((percent + 30) * Math.PI / 180) * (circle_r - 10),

      Math.cos((percent + 30) * Math.PI / 180) * (circle_r - 10),

    );

    linearGradient.addColorStop(0, "#5096F1");

    linearGradient.addColorStop(1, "#1C80F1");

    ctx.strokeStyle = linearGradient

    //ctx.strokeStyle = "#5096F1"

    ctx.lineWidth = 12

    ctx.arc(0, 0, circle_r - 10, startDegree * Math.PI / 180 - 0.5 * Math.PI,

      percent * Math.PI / 180 + startDegree * Math.PI / 180 - 0.5 * Math.PI, false);

    ctx.stroke();

    ctx.closePath();

    ctx.beginPath();

    ctx.strokeStyle = "#FFFFFF"

    //ctx.fillStyle = "#FFFFFF"

    ctx.lineWidth = 5

    ctx.arc(

      -Math.sin((percent + 30) * Math.PI / 180) * (circle_r - 10),

      Math.cos((percent + 30) * Math.PI / 180) * (circle_r - 10),

      2, 0, 2 * Math.PI, true);

    //ctx.fill()

    ctx.stroke();

    ctx.closePath();

  },

2653aee2d0d31af40bb4486fcbd3450b.png 4feaaace34d6bb66213245c7eb0d0101.png e932db48bb2e4425948bd065a2e43de3.png 88430525e4f9b8d57519196d8bbfc986.png ef82b403d8f7b485c13a4cc8ff5e0a57.png 75c9b8b3-982a-eb11-8da9-e4434bdf6706.svg

增加功能

77c9b8b3-982a-eb11-8da9-e4434bdf6706.svg e2481d536727a41d656a7bcb61508da8.png 2d62bb7f17ea96b93947b5eb188d727d.png

添加增加减少的功能

addNumber: function(){

    clearInterval(this.data.time)

    this.data.time = setInterval(()=>{

      if(this.data.c_val 

        this.setData({

          c_val: this.data.c_val+1

        })

        var percent = 300 * ((this.data.c_val - minValue) / (maxValue - minValue)); //计算结果

        this.showCircle(ctx,circle_r,startDegree,lineWidth,percent)

      }else{

        clearInterval(this.data.time)

      }

    },50)

  },

  cutNumber: function(){

    clearInterval(this.data.time)

    this.data.time = setInterval(()=>{

      if(this.data.c_val > 0){

        this.setData({

          c_val: this.data.c_val - 1

        })

        var percent = 300 * ((this.data.c_val - minValue) / (maxValue - minValue)); //计算结果

        this.showCircle(ctx,circle_r,startDegree,lineWidth,percent)

      }else{

        clearInterval(this.data.time)

      }

    },50)

  },

10a618c64aca7666098b022c30734187.png 5f984572e6524733cc4933da5c58dd14.png 173c84d181a6a1cd973289d14f694c08.png 572bc4c312781fe353511f117bf4aad8.png 2ec699a81723461c61de9df3387284eb.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值