微信小程序之圆形进度条实现思路


Posted in Javascript onFebruary 22, 2018

需求概要

小程序中使用圆形倒计时,效果图:

微信小程序之圆形进度条实现思路

思路

  • 使用2个canvas 一个是背景圆环,一个是彩色圆环。
  • 使用setInterval 让彩色圆环逐步绘制。

解决方案

第一步先写结构

一个盒子包裹2个canvas以及文字盒子;

盒子使用相对定位作为父级,flex布局,设置居中;

一个canvas,使用绝对定位作为背景,canvas-id="canvasProgressbg"

另一个canvas,使用相对定位作为进度条,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
.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如下:

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

第三步canvas绘制

敲黑板,划重点

1. 先绘制背景

  1. 在js中封装一个画圆环的函数drawProgressbg,canvas 画圆
  2. 在onReady中执行这个函数;

小程序canvas组件与H5的canvas有点差别,请查看文档,代码如下

drawProgressbg: function(){
 // 使用 wx.createContext 获取绘图上下文 context
 var ctx = wx.createCanvasContext('canvasProgressbg')
 ctx.setLineWidth(4);// 设置圆环的宽度
 ctx.setStrokeStyle('#20183b'); // 设置圆环的颜色
 ctx.setLineCap('round') // 设置圆环端点的形状
 ctx.beginPath();//开始一个新的路径
 ctx.arc(110, 110, 100, 0, 2 * Math.PI, false);
 //设置一个原点(100,100),半径为90的圆的路径到当前路径
 ctx.stroke();//对当前路径进行描边
 ctx.draw();
 },
 onReady: function () {
 this.drawProgressbg(); 
 },

看一下效果如下:

微信小程序之圆形进度条实现思路

2. 绘制彩色圆环

  1. 在js中封装一个画圆环的函数drawCircle,
  2. 在onReady中执行这个函数;
drawCircle: function (step){ 
 var context = wx.createCanvasContext('canvasProgress');
 // 设置渐变
 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(); 
 // 参数step 为绘制的圆环周长,从0到2为一周 。 -Math.PI / 2 将起始角设在12点钟位置 ,结束角 通过改变 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) 
 },

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

微信小程序之圆形进度条实现思路

3. 设置一个定时器

在js中的data设置一个计数器 count,一个步骤step,一个定时器

在js中封装一个定时器的函数countInterval,

在onReady中执行这个函数;

data: {
 progress_txt: '正在匹配中...', 
 count:0, // 设置 计数器 初始为0
 countTimer: null // 设置 定时器 初始为null
 },
 countInterval: function () {
 // 设置倒计时 定时器 每100毫秒执行一次,计数器count+1 ,耗时6秒绘一圈
 this.countTimer = setInterval(() => {
 if (this.data.count <= 60) {
 /* 绘制彩色圆环进度条 
 注意此处 传参 step 取值范围是0到2,
 所以 计数器 最大值 60 对应 2 做处理,计数器count=60的时候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()
 },

最终效果

微信小程序之圆形进度条实现思路

总结

以上所述是小编给大家介绍的微信小程序之圆形进度条实现思路,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
自定义ExtJS控件之下拉树和下拉表格附源码
Oct 15 Javascript
javascript通过navigator.userAgent识别各种浏览器
Oct 25 Javascript
node.js中的fs.exists方法使用说明
Dec 17 Javascript
jQuery实现选项联动轮播效果【附实例】
Apr 19 Javascript
Vue.js每天必学之指令系统与自定义指令
Sep 07 Javascript
React中阻止事件冒泡的问题详析
Apr 12 Javascript
layUI实现前端分页和后端分页
Jul 27 Javascript
浅谈Vue.use到底是什么鬼
Jan 21 Javascript
vue实现全屏滚动效果(非fullpage.js)
Mar 07 Javascript
JS Array.from()将伪数组转换成数组的方法示例
Mar 23 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
May 10 Javascript
Jquery高级应用Deferred对象原理及使用实例
May 28 jQuery
webpack下实现动态引入文件方法
Feb 22 #Javascript
JavaScript 有用的代码片段和 trick
Feb 22 #Javascript
3种vue路由传参的基本模式
Feb 22 #Javascript
webpack打包并将文件加载到指定的位置方法
Feb 22 #Javascript
vue2.0 elementUI制作面包屑导航栏
Feb 22 #Javascript
webpack将js打包后的map文件详解
Feb 22 #Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
Feb 22 #Javascript
You might like
Ajax PHP简单入门教程代码
2008/04/25 PHP
php使用类继承解决代码重复的问题
2015/02/11 PHP
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
2015/09/04 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
Bootstrap基本组件学习笔记之进度条(15)
2016/12/08 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
探索Vue高阶组件的使用
2018/01/08 Javascript
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
Python显示进度条的方法
2014/09/20 Python
举例讲解Python的Tornado框架实现数据可视化的教程
2015/05/02 Python
Python导出DBF文件到Excel的方法
2015/07/25 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
基于python实现地址和经纬度转换
2020/05/19 Python
澳大利亚领先的女性运动服品牌:Lorna Jane
2020/06/19 全球购物
大型主题婚礼活动策划方案
2014/09/15 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python
js实现模拟购物商城案例
2021/05/18 Javascript
Java异常体系非正常停止和分类
2022/06/14 Java/Android