微信小程序之圓形進(jìn)度條

來源:月影
鏈接:http://segmentfault.com/a/1190000013219501

由于版本庫升級(jí)做對(duì)應(yīng)的更新(20190716)
wx.createCanvasContext(id) 改為 wx.createCanvasContext(id,this)

說明:這篇文章是對(duì) 之前同名文章 排版進(jìn)行的修改硫兰,亦可通過上面鏈接閱讀原文。

需求概要

小程序中使用圓形倒計(jì)時(shí)袋倔,效果圖:

效果1

思路

(1)使用2個(gè)canvas 一個(gè)是背景圓環(huán),一個(gè)是彩色圓環(huán)。
(2)使用setInterval 讓彩色圓環(huán)逐步繪制圈浇。

第一步先寫結(jié)構(gòu)

(1)一個(gè)盒子包裹2個(gè)canvas以及文字盒子;
(2)盒子使用相對(duì)定位作為父級(jí),flex布局糊昙,設(shè)置居中;
(3)一個(gè)canvas谢谦,使用絕對(duì)定位作為背景释牺,canvas-id="canvasProgressbg"
(4)另一個(gè)canvas萝衩,使用相對(duì)定位作為進(jìn)度條,canvas-id="canvasProgress"

代碼如下:

// 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 */
/* 這里的寬高是必須大于等于canvas圓環(huán)的直徑 否則繪制到盒子外面就看不見了 */
/* 一開始設(shè)置 width:440rpx; height:440rpx; 發(fā)現(xiàn) 在360X640分辨率的設(shè)備船侧,下繪制的圓環(huán)跑盒子外去了 */
/* 小程序使用rpx單位適配 ,但是canvas繪制的是px單位的厅各。所以只能用px單位繪制的圓環(huán)在盒子內(nèi)顯示 */
.progress_box{
 position: relative;
 width:220px;
 height: 220px;  
 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;
}

第二步數(shù)據(jù)綁定

從wxml中可以看到我們使用了一個(gè)數(shù)據(jù)progress_txt镜撩,所以在js中設(shè)置data如下:

data: {
   progress_txt: '正在匹配中...',  
},

第三步canvas繪制

敲黑板,劃重點(diǎn)队塘。

1. 先繪制背景

(1)在js中封裝一個(gè)畫圓環(huán)的函數(shù)drawProgressbg袁梗,canvas 畫圓
(2)在onReady中執(zhí)行這個(gè)函數(shù);

小程序canvas組件與H5的canvas有點(diǎn)差別憔古,請(qǐng)查看文檔遮怜,代碼如下:

drawProgressbg: function(){
   // 使用 wx.createContext 獲取繪圖上下文 context
   var ctx = wx.createCanvasContext('canvasProgressbg')
   ctx.setLineWidth(4); // 設(shè)置圓環(huán)的寬度
   ctx.setStrokeStyle('#20183b'); // 設(shè)置圓環(huán)的顏色
   ctx.setLineCap('round'); // 設(shè)置圓環(huán)端點(diǎn)的形狀
   ctx.beginPath(); // 開始一個(gè)新的路徑
   ctx.arc(110, 110, 100, 0, 2 * Math.PI, false);
   // 設(shè)置一個(gè)原點(diǎn)(100,100),半徑為90的圓的路徑到當(dāng)前路徑
   ctx.stroke(); // 對(duì)當(dāng)前路徑進(jìn)行描邊
   ctx.draw();
 },
onReady: function () {
   this.drawProgressbg();
},

看一下效果如下:

效果2

2. 繪制彩色圓環(huán)

(1)在js中封裝一個(gè)畫圓環(huán)的函數(shù)drawCircle鸿市,
(2)在onReady中執(zhí)行這個(gè)函數(shù)锯梁;

代碼如下:

drawCircle: function (step){  
    var context = wx.createCanvasContext('canvasProgress');
    // 設(shè)置漸變
    var gradient = context.createLinearGradient(200, 100, 100, 200);
    gradient.addColorStop("0", "#2661DD");
    gradient.addColorStop("0.5", "#40ED94");
    gradient.addColorStop("1.0", "#5956CC");
    context.setLineWidth(10);
    context.setStrokeStyle(gradient);
    context.setLineCap('round')
    context.beginPath();
    // 參數(shù)step 為繪制的圓環(huán)周長,從0到2為一周 焰情。 -Math.PI / 2 將起始角設(shè)在12點(diǎn)鐘位置 陌凳,結(jié)束角 通過改變 step 的值確定
    context.arc(110, 110, 100, -Math.PI / 2, step * Math.PI - Math.PI / 2, false);
    context.stroke();
    context.draw();
 },
onReady: function () {
    this.drawProgressbg();
    this.drawCircle(2)
},

效果:

效果3

3. 設(shè)置一個(gè)定時(shí)器

(1)在js中的data設(shè)置一個(gè)計(jì)數(shù)器 count,一個(gè)步驟step,一個(gè)定時(shí)器
(2)在js中封裝一個(gè)定時(shí)器的函數(shù)countInterval,
(3)在onReady中執(zhí)行這個(gè)函數(shù)内舟;

代碼如下:

data: {
   progress_txt: '正在匹配中...',  
   count: 0,  // 設(shè)置 計(jì)數(shù)器 初始為0
   countTimer: null // 設(shè)置 定時(shí)器 初始為null
},
countInterval: function () {
   // 設(shè)置倒計(jì)時(shí) 定時(shí)器 每100毫秒執(zhí)行一次合敦,計(jì)數(shù)器count+1 ,耗時(shí)6秒繪一圈
   this.countTimer = setInterval(() => {
     if (this.data.count <= 60) {
       /* 繪制彩色圓環(huán)進(jìn)度條  
       注意此處 傳參 step 取值范圍是0到2,
       所以 計(jì)數(shù)器 最大值 60 對(duì)應(yīng) 2 做處理验游,計(jì)數(shù)器count=60的時(shí)候step=2 */
       this.drawCircle(this.data.count / (60/2));
       this.data.count++;
     } else {
       this.setData({progress_txt: "匹配成功"});
       clearInterval(this.countTimer);
     }
   }, 100);
 },
onReady: function () {
   this.drawProgressbg();
   // this.drawCircle(2);
   this.countInterval();
},

最終效果

最終效果

感興趣的小伙伴充岛,可以關(guān)注公眾號(hào)【grain先森】,回復(fù)關(guān)鍵詞 “小程序”耕蝉,獲取更多資料崔梗,更多關(guān)鍵詞玩法期待你的探索~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市垒在,隨后出現(xiàn)的幾起案子炒俱,更是在濱河造成了極大的恐慌,老刑警劉巖爪膊,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件权悟,死亡現(xiàn)場離奇詭異,居然都是意外死亡推盛,警方通過查閱死者的電腦和手機(jī)峦阁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耘成,“玉大人榔昔,你說我怎么就攤上這事驹闰。” “怎么了撒会?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵嘹朗,是天一觀的道長。 經(jīng)常有香客問我诵肛,道長屹培,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任怔檩,我火速辦了婚禮褪秀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薛训。我一直安慰自己媒吗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布乙埃。 她就那樣靜靜地躺著闸英,像睡著了一般。 火紅的嫁衣襯著肌膚如雪介袜。 梳的紋絲不亂的頭發(fā)上自阱,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音米酬,去河邊找鬼沛豌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赃额,可吹牛的內(nèi)容都是我干的加派。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼跳芳,長吁一口氣:“原來是場噩夢啊……” “哼芍锦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起飞盆,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤娄琉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后吓歇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孽水,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年城看,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了女气。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡测柠,死狀恐怖炼鞠,靈堂內(nèi)的尸體忽然破棺而出缘滥,到底是詐尸還是另有隱情,我是刑警寧澤谒主,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布朝扼,位于F島的核電站,受9級(jí)特大地震影響霎肯,放射性物質(zhì)發(fā)生泄漏擎颖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一姿现、第九天 我趴在偏房一處隱蔽的房頂上張望肠仪。 院中可真熱鬧肖抱,春花似錦备典、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荤崇,卻和暖如春拌屏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背术荤。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工倚喂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓣戚。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓端圈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親子库。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舱权,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344