微信小程序 canvas 環(huán)形刻度 進(jìn)度條

(本仙女的第一篇文章吩坝,感謝支持)
最近做小程序需要一個環(huán)形刻度條,發(fā)現(xiàn)有關(guān)微信小程序的類似文章很少,目前只找到了一個關(guān)于H5的canvas繪制刻度條和我需求是一樣的着憨,于是自己改了改。
話不多說务嫡,開始吧甲抖。。心铃。


效果圖

1准谚、首先在wxml上創(chuàng)建一個畫布

<view class="container">
    <canvas canvas-id="firstCanvas" type="2d" id="firstCanvas" style="width:200px;height:200px;display:block;"></canvas>
    <view class="percentage">{{process}}%</view>
</view>

2、在js中創(chuàng)建畫布,獲取節(jié)點(diǎn)信息去扣。

小程序 獲取節(jié)點(diǎn)信息 的文檔地址:
https://developers.weixin.qq.com/miniprogram/dev/api/wxml/wx.createSelectorQuery.html

  const query = wx.createSelectorQuery()
    query.select('#firstCanvas')
     .fields({
        node: true,
        size: true
      })
      .exec((res) => {
        const canvas = res[0].node
        ctx = canvas.getContext('2d')
      })

3柱衔、繪制刻度線。

    obj = {
          width: 300,
          height: 300,
          dx: 20, // 刻度寬度
          dy: 4, // 刻度高度
          num: 24, // 刻度條數(shù)
          r: 70, // 半徑
          start: -90, // 開始角度愉棱,與結(jié)束角度相對稱
          progress: 75, // 顯示進(jìn)度 (單位百分比)
          index: 0, // 開始刻度
          defaultColor: '#dee1e4', // 開始顏色
          activeColor: '#5CCCFF' // 進(jìn)度條顏色
        };
        obj.deg = (180 - 2 * obj.start) / obj.num;
        canvas.width = obj.width;
        canvas.height = obj.height;

        for (var x = 0; x < obj.num; x++) { //灰色刻度線
          draw(x, obj.defaultColor);
        }

        function draw(x, color) { // 畫出環(huán)形刻度線
          ctx.save();
          var deg = Math.PI / 180 * (obj.start + obj.deg * x); // 角度換算弧度
          var offsetY = -(Math.sin(deg) * obj.r); // 計(jì)算刻度Y軸位置
          var offsetX = -(Math.cos(deg) * obj.r); // 計(jì)算刻度X軸位置
          ctx.fillStyle = color;
          ctx.translate(obj.width / 2 - offsetX, obj.height / 2 - offsetY); // 修改畫布坐標(biāo)原點(diǎn)
          ctx.rotate(deg); // 旋轉(zhuǎn)刻度
          ctx.fillRect(0, 0, obj.dx, obj.dy); // 畫出刻度
          ctx.restore();
        }

4唆铐、實(shí)現(xiàn)動畫效果。

    function animate(s, time) {
       if (obj.progress == 0) { // 進(jìn)度為0直接退出函數(shù)
         return false;
      }
      draw(s, obj.activeColor);

      var num = obj.progress * (obj.num / 100); //格數(shù)計(jì)算

      var timmer = setTimeout(function () {
          obj.index = s + 1;

          if (s >= num) {
              clearTimeout(timmer);
            } else {
              if (s > num - 10) { // 剩余10格動畫減速
                animate(obj.index, time + 20);
              } else {
                animate(obj.index, time);
              }

            }
          }, time)
     }

附上完整的js代碼:

let ctx = null
let obj = {}
Page({
  data: {

  },
  onLoad: function (options) {},
  
  onReady() {
    this.animation()
  },

  animation() {
    const query = wx.createSelectorQuery()
    query.select('#firstCanvas')
      .fields({
        node: true,
        size: true
      })
      .exec((res) => {
        const canvas = res[0].node
        ctx = canvas.getContext('2d')
        obj = {
          width: 300,
          height: 300,
          dx: 20, // 刻度寬度
          dy: 4, // 刻度高度
          num: 24, // 刻度條數(shù)
          r: 70, // 半徑
          start: -90, // 開始角度羽氮,與結(jié)束角度相對稱
          progress: 75, // 顯示進(jìn)度 (單位百分比)
          index: 0, // 開始刻度
          defaultColor: '#dee1e4', // 開始顏色
          activeColor: '#5CCCFF' // 進(jìn)度條顏色
        };
        this.setData({
          process: obj.progress
        })
        obj.deg = (180 - 2 * obj.start) / obj.num;
        canvas.width = obj.width;
        canvas.height = obj.height;

        for (var x = 0; x < obj.num; x++) { //灰色刻度線
          draw(x, obj.defaultColor);
        }

        function draw(x, color) { // 畫出環(huán)形刻度線
          ctx.save();
          var deg = Math.PI / 180 * (obj.start + obj.deg * x); // 角度換算弧度
          var offsetY = -(Math.sin(deg) * obj.r); // 計(jì)算刻度Y軸位置
          var offsetX = -(Math.cos(deg) * obj.r); // 計(jì)算刻度X軸位置
          ctx.fillStyle = color;
          ctx.translate(obj.width / 2 - offsetX, obj.height / 2 - offsetY); // 修改畫布坐標(biāo)原點(diǎn)
          ctx.rotate(deg); // 旋轉(zhuǎn)刻度
          ctx.fillRect(0, 0, obj.dx, obj.dy); // 畫出刻度
          ctx.restore();
        }

        function animate(s, time) {
          if (obj.progress == 0) { // 進(jìn)度為0直接退出函數(shù)
            return false;
          }
          draw(s, obj.activeColor);

          var num = obj.progress * (obj.num / 100); //格數(shù)計(jì)算

          var timmer = setTimeout(function () {
            obj.index = s + 1;

            if (s >= num) {
              clearTimeout(timmer);
            } else {
              if (s > num - 10) { // 剩余10格動畫減速
                animate(obj.index, time + 20);
              } else {
                animate(obj.index, time);
              }

            }
          }, time)
        }
        animate(obj.index, 10)
      })
  }
})

這基本就實(shí)現(xiàn)了或链,這個項(xiàng)目我已經(jīng)上傳到了github上,希望能幫到你們https://github.com/zhangwei727/wx_circular_scaleBar.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末档押,一起剝皮案震驚了整個濱河市澳盐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌令宿,老刑警劉巖叼耙,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粒没,居然都是意外死亡筛婉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爽撒,“玉大人入蛆,你說我怎么就攤上這事∷段穑” “怎么了哨毁?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長源武。 經(jīng)常有香客問我扼褪,道長,這世上最難降的妖魔是什么粱栖? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任话浇,我火速辦了婚禮,結(jié)果婚禮上闹究,老公的妹妹穿的比我還像新娘幔崖。我一直安慰自己,他們只是感情好渣淤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布岖瑰。 她就那樣靜靜地躺著,像睡著了一般砂代。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上率挣,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天刻伊,我揣著相機(jī)與錄音,去河邊找鬼椒功。 笑死捶箱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的动漾。 我是一名探鬼主播丁屎,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旱眯!你這毒婦竟也來了晨川?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤删豺,失蹤者是張志新(化名)和其女友劉穎共虑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呀页,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妈拌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蓬蝶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尘分。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡猜惋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出培愁,到底是詐尸還是另有隱情著摔,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布竭钝,位于F島的核電站梨撞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏香罐。R本人自食惡果不足惜卧波,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望庇茫。 院中可真熱鬧港粱,春花似錦、人聲如沸旦签。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宁炫。三九已至偿曙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羔巢,已是汗流浹背望忆。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竿秆,地道東北人启摄。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像幽钢,于是被迫代替她去往敵國和親歉备。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350