• 微信小程序 使用canvas画圆形倒计时


    先来效果图

    wxml页面

    <view class="container">
         <view class='progress_box'>
            <canvas class="progress_bg"   canvas-id="canvasProgressbg">  </canvas> 
            <canvas class="progress_canvas" canvas-id="secondCanvas"></canvas>
        </view>
    </view>

    wxss页面

    .progress_box{
      position: relative;
      width:84px;
      height: 84px;  
      display: flex;  
      align-items: center;
      justify-content: center;
      background-color: #03abfd;
      border-radius: 84px;
    }
    .progress_bg{
      position: absolute;
      width:84px;
      height: 84px; 
    }
    .progress_canvas{
      width:84px;
      height: 84px; 
    } 

    js页面

    // page/process/process.js
    Page({
    
      /**
       * 页面的初始数据
       */
      data: {
          
    
      },
    
      drawProgressbg: function () {
        // 使用 wx.createContext 获取绘图上下文 context
        var ctx = wx.createCanvasContext('canvasProgressbg')
        ctx.setLineWidth(15);// 设置圆环的宽度
        ctx.setStrokeStyle('#F18136'); // 设置圆环的颜色
        ctx.setLineCap('round') // 设置圆环端点的形状
        ctx.beginPath();//开始一个新的路径
        ctx.arc(42, 42, 30, 0, 2 * Math.PI, false);
        //设置一个原点(100,100),半径为90的圆的路径到当前路径
        ctx.stroke();//对当前路径进行描边
        ctx.draw();
      },
    
      /**
       * 生命周期函数--监听页面加载
       */
      onLoad: function (options) {
        var step = 1,//计数动画次数
          num = 0,//计数倒计时秒数(n - num)
          start = 1.5 * Math.PI,// 开始的弧度
          end = -0.5 * Math.PI,// 结束的弧度
          time = null;// 计时器容器
    
        var animation_interval = 1000,// 每1秒运行一次计时器
          n = 10; // 当前倒计时为10秒
        // 动画函数
        function animation() {
          if (step <= n) {
            end = end + 2 * Math.PI / n;
            ringMove(start, end);
            step++;
          } else {
            clearInterval(time);
          }
        };
        // 画布绘画函数
        function ringMove(s, e) {
          var context = wx.createCanvasContext('secondCanvas')
    
          var gradient = context.createLinearGradient(200, 100, 100, 200);
          gradient.addColorStop("0", "#2661DD");
          gradient.addColorStop("0.5", "#40ED94");
          gradient.addColorStop("1.0", "#5956CC");
    
          // 绘制圆环
          context.setStrokeStyle('#f6cbf4')
          context.beginPath()
          context.setLineWidth(10)
          context.arc(42, 42, 30, s, e, true)
          context.stroke()
          context.closePath()
    
          // 绘制倒计时文本
          context.beginPath()
          context.setLineWidth(1)
          context.setFontSize(30)
          context.setFillStyle('#ffffff')
          context.setTextAlign('center')
          context.setTextBaseline('middle')
          context.fillText(n - num + '', 42, 42, 30)
          context.fill()
          context.closePath()
    
          context.draw()
    
          // 每完成一次全程绘制就+1
          num++;
        }
        // 倒计时前先绘制整圆的圆环
        ringMove(start, end);
        // 创建倒计时
        time = setInterval(animation, animation_interval);
      },
    
      /**
       * 生命周期函数--监听页面初次渲染完成
       */
      onReady: function () {
        this.drawProgressbg(); 
      },
    
      /**
       * 生命周期函数--监听页面显示
       */
      onShow: function () {
      
      },
    
      /**
       * 生命周期函数--监听页面隐藏
       */
      onHide: function () {
      
      },
    
      /**
       * 生命周期函数--监听页面卸载
       */
      onUnload: function () {
      
      },
    
      /**
       * 页面相关事件处理函数--监听用户下拉动作
       */
      onPullDownRefresh: function () {
      
      },
    
      /**
       * 页面上拉触底事件的处理函数
       */
      onReachBottom: function () {
      
      },
    
      /**
       * 用户点击右上角分享
       */
      onShareAppMessage: function () {
      
      }
    })
  • 相关阅读:
    MVC三层架构
    Cookie
    request (请求转发)
    response 重定向
    HttpServletResponse(响应),实现文件下载,实现验证码功能
    HTTP报文格式
    基于UUID生成短ID
    一致性hash应用到redis
    spring-mysqlclient开源了
    Effection Go
  • 原文地址:https://www.cnblogs.com/quietxin/p/9418813.html
Copyright © 2020-2023  润新知