1. 程式人生 > >微信小程式中使用圓形倒計時例項

微信小程式中使用圓形倒計時例項

需求概要

小程式中使用圓形倒計時,效果圖:

思路

  1. 使用2個canvas 一個是背景圓環,一個是彩色圓環。

解決方案

第一步先寫結構

一個盒子包裹2個canvas以及文字盒子;
盒子使用相對定位作為父級,flex佈局,設定居中;
一個canvas,使用絕對定位作為背景,canvas-id="canvasProgressbg"
另一個canvas,使用相對定位作為進度條,canvas-id="canvasProgress"
程式碼如下:

  1. // wxml

<view class="container">

<view class='progress_box'>

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

<canvas class="progress_canvas" canvas-id="canvasProgress"> </canvas>

<view class="progress_text">

<view class="progress_dot"></view>

<text class='progress_info'> {{progress_txt}}</text>

</view>

</view>

</view>

// wxss

.progress_box{

position: relative;

width:220px;

height: 220px;

// 這裡的寬高是必須大於等於canvas圓環的直徑 否則繪製到盒子外面就看不見了

// 一開始設定 width:440rpx; height:440rpx; 發現 在360X640解析度的裝置,下繪製的圓環跑盒子外去了

// 小程式使用rpx單位適配 ,但是canvas繪製的是px單位的。所以只能用px單位繪製的圓環在盒子內顯示

display: flex;

align-items: center;

justify-content: center;

background-color: #eee;

}

.progress_bg{

position: absolute;

width:220px;

height: 220px;

}

.progress_canvas{

width:220px;

height: 220px;

}

.progress_text{

position: absolute;

display: flex;

align-items: center;

justify-content: center

}

.progress_info{

font-size: 36rpx;

padding-left: 16rpx;

letter-spacing: 2rpx

}

.progress_dot{

width:16rpx;

height: 16rpx;

border-radius: 50%;

background-color: #fb9126;

}

第二步資料繫結

從wxml中可以看到我們使用了一個數據progress_txt,所以在js中設定data如下:

  1. data: {

  2. progress_txt: '正在匹配中...',

  3. },

第三步canvas繪製

敲黑板,劃重點

1. 先繪製背景

  1. 在js中封裝一個畫圓環的函式drawProgressbg,canvas 畫圓
  2. 在onReady中執行這個函式;

小程式canvas元件與H5的canvas有點差別,請檢視文件,程式碼如下

  1. drawProgressbg: function(){

  2. // 使用 wx.createContext 獲取繪圖上下文 context

  3. var ctx = wx.createCanvasContext('canvasProgressbg')

  4. ctx.setLineWidth(4);// 設定圓環的寬度

  5. ctx.setStrokeStyle('#20183b'); // 設定圓環的顏色

  6. ctx.setLineCap('round') // 設定圓環端點的形狀

  7. ctx.beginPath();//開始一個新的路徑

  8. ctx.arc(110, 110, 100, 0, 2 * Math.PI, false);

  9. //設定一個原點(100,100),半徑為90的圓的路徑到當前路徑

  10. ctx.stroke();//對當前路徑進行描邊

  11. ctx.draw();

  12. },

  13. onReady: function () {

  14. this.drawProgressbg();

  15. },

看一下效果如下:

2. 繪製彩色圓環

  1. 在js中封裝一個畫圓環的函式drawCircle,
  2. 在onReady中執行這個函式;
  1. drawCircle: function (step){

  2. var context = wx.createCanvasContext('canvasProgress');

  3. // 設定漸變

  4. var gradient = context.createLinearGradient(200, 100, 100, 200);

  5. gradient.addColorStop("0", "#2661DD");

  6. gradient.addColorStop("0.5", "#40ED94");

  7. gradient.addColorStop("1.0", "#5956CC");

  8. context.setLineWidth(10);

  9. context.setStrokeStyle(gradient);

  10. context.setLineCap('round')

  11. context.beginPath();

  12. // 引數step 為繪製的圓環周長,從0到2為一週 。 -Math.PI / 2 將起始角設在12點鐘位置 ,結束角 通過改變 step 的值確定

  13. context.arc(110, 110, 100, -Math.PI / 2, step * Math.PI - Math.PI / 2, false);

  14. context.stroke();

  15. context.draw()

  16. },

  17. onReady: function () {

  18. this.drawProgressbg();

  19. this.drawCircle(2)

  20. },

this.drawCircle(0.5) 效果如下: this.drawCircle(1) 效果如下: this.drawCircle(2) 效果如下:

3. 設定一個定時器

  1. 在js中的data設定一個計數器 count,一個步驟step,一個定時器
  2. 在js中封裝一個定時器的函式countInterval,
  3. 在onReady中執行這個函式;
  1. data: {

  2. progress_txt: '正在匹配中...',

  3. count:0, // 設定 計數器 初始為0

  4. countTimer: null // 設定 定時器 初始為null

  5. },

  6. countInterval: function () {

  7. // 設定倒計時 定時器 每100毫秒執行一次,計數器count+1 ,耗時6秒繪一圈

  8. this.countTimer = setInterval(() => {

  9. if (this.data.count <= 60) {

  10. /* 繪製彩色圓環進度條

  11. 注意此處 傳參 step 取值範圍是0到2,

  12. 所以 計數器 最大值 60 對應 2 做處理,計數器count=60的時候step=2

  13. */

  14. this.drawCircle(this.data.count / (60/2))

  15. this.data.count++;

  16. } else {

  17. this.setData({

  18. progress_txt: "匹配成功"

  19. });

  20. clearInterval(this.countTimer);

  21. }

  22. }, 100)

  23. },

  24. onReady: function () {

  25. this.drawProgressbg();

  26. // this.drawCircle(2)

  27. this.countInterval()

  28. },

最終效果