思路

使用2个canvas 一个是背景圆环,一个是彩色圆环。

使用setInterval 让彩色圆环逐步绘制。

在看我的文章前,必须先看 ,下面转的文章,因为本文是在它们基础上修改的.

它们的缺点为:

1.组件必须用js实例化 (如果我有一个任务列表,后面会显示每个任务的进度,每个任务都必须实例化)

2.它们js实例化时,绘图是用 px绘制,导致页面用rpx布局,组件却用px绘制.

修改后的组件

在components文件加下建立  circle组件,如图

circle.js :

/*components/circle/circle.js*/Component({

options: {

multipleSlots:true //在组件定义时的选项中启用多slot支持

},

properties: {

draw: {//画板元素名称id

type: String,

value:'draw',

observer:function(newVal,oldVal,change){

console.log(newVal, oldVal, change);this.onreset(); //数值变化是所有重绘

}

},

per:{//百分比 通过此值转换成step

type: String,

value:'0',

observer:function(newVal,oldVal,change){

console.log(newVal, oldVal, change);this.onreset();//数值变化是所有重绘

}

},

r:{//半径

type: String,

value:'50',

observer:function(newVal,oldVal,change){

console.log(newVal, oldVal, change);this.onreset();//数值变化是所有重绘

}

}

},

data: {/*私有数据,可用于模版渲染*/step:1, //用来算圆的弧度0-2

size:0, //画板大小

screenWidth:750, //实际设备的宽度

txt:0},

methods: {/*** el:画圆的元素

* r:圆的半径

* w:圆的宽度

* 功能:画背景*/drawCircleBg: function (el, r, w) {const ctx = wx.createCanvasContext(el,this);

ctx.clearRect(0, 0, 2*r, 2*r);

ctx.draw();//清空缓存内容

ctx.setLineWidth(w);//设置圆环的宽度

ctx.setStrokeStyle('#E5E5E5'); //设置圆环的颜色

ctx.setLineCap('round') //设置圆环端点的形状

ctx.beginPath();//开始一个新的路径

ctx.arc(r, r, r - w, 0, 2 * Math.PI, false);//设置一个原点(110,110),半径为100的圆的路径到当前路径

ctx.stroke();//对当前路径进行描边

ctx.draw();

},/*** el:画圆的元素

* r:圆的半径

* w:圆的宽度

* step:圆的弧度 (0-2)

* 功能:彩色圆环*/drawCircle: function (el, r, w, step) {

var context= wx.createCanvasContext(el,this);

context.clearRect(0, 0, 2*r, 2*r);

context.draw();//清空缓存内容//设置渐变

var gradient = context.createLinearGradient(2 * r, r, 0);

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

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

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

context.setLineWidth(w);

context.setStrokeStyle(gradient);

context.setLineCap('round')

context.beginPath();//开始一个新的路径//step 从0到2为一周

context.arc(r, r, r - w, -Math.PI / 2, step * Math.PI - Math.PI / 2, false);

context.stroke();//对当前路径进行描边

step?context.draw():''; //当step为空的时候不画0%

},/*** 功能:重绘画板*/onreset: function () {const _this = this;//获取屏幕宽度

wx.getSystemInfo({

success: function(res) {

_this.setData({

screenWidth: res.windowWidth

});

},

});//初始化

const el = _this.data.draw; //画板元素

const per = _this.data.per; //圆形进度

const r = Number(_this.data.r); //圆形半径

_this.setData({

step: (2 * Number(_this.data.per)) / 100,

txt: _this.data.per

});//获取屏幕宽度(并把真正的半径px转成rpx)

let rpx = (_this.data.screenWidth / 750) *r;//计算出画板大小

this.setData({

size: rpx* 2});const w = 4;//圆形的宽度//组件入口,调用下面即可绘制 背景圆环和彩色圆环。

_this.drawCircleBg(el + 'bg', rpx, w);//绘制 背景圆环

_this.drawCircle(el, rpx, w, _this.data.step);//绘制 彩色圆环

}

},

lifetimes: {//生命周期函数,可以为函数,或一个在methods段中定义的方法名

attached: function () {const _this = this;//获取屏幕宽度

wx.getSystemInfo({

success: function(res) {

_this.setData({

screenWidth: res.windowWidth

});

},

});//初始化

const el = _this.data.draw; //画板元素

const per = _this.data.per; //圆形进度

const r = Number(_this.data.r); //圆形半径

_this.setData({

step: (2 * Number(_this.data.per)) / 100,

txt: _this.data.per

});//获取屏幕宽度(并把真正的半径px转成rpx)

let rpx = (_this.data.screenWidth / 750) *r;//计算出画板大小

this.setData({

size: rpx* 2});const w = 4;//圆形的宽度//组件入口,调用下面即可绘制 背景圆环和彩色圆环。

_this.drawCircleBg(el + 'bg', rpx, w);//绘制 背景圆环

_this.drawCircle(el, rpx, w, _this.data.step);//绘制 彩色圆环

}

}

})

circle.wxml :

{{txt}}%

circle.json :

{"component": true,"usingComponents": {}

}

circle.wxss :

.circle_box,.circle_draw{position:relative; }.circle_bg{position:absolute;}.circle_box{display:flex;flex-direction:row;justify-content:center;align-items:center;

}.circle_txt{position:absolute;font-size:28rpx;

}

调用 :

在所需页面的XXX.json 先引入 组件

{"usingComponents": {"circle": "/components/circle/circle"}

}

wxml 使用组件

draw : 确定 canvas的id

per : 进度百分比 (1-100)

r: 圆的半径 (按px,最终转化成rpx)

结果:

注意,1楼网友反馈,数据更新时组件没更新,(我临时把声明周期的函数,复制了一份移动到methods中,在属性值变化是调用了一下,可以数据更新了)

转 :

https://segmentfault.com/a/1190000013219501

https://segmentfault.com/a/1190000013242747?utm_source=tag-newest

参考微信自定义组件讲解 : https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/

vant 半圆仪表盘_微信小程序之圆形进度条(自定义组件)相关推荐

  1. 微信小程序 环形进度条_微信小程序实现圆形进度条实例分享

    本文主要和大家分享微信小程序实现圆形进度条实例,希望能帮助到大家. 小程序中使用圆形倒计时,效果图: 思路使用2个canvas 一个是背景圆环,一个是彩色圆环. 使用setInterval 让彩色圆环 ...

  2. 微信小程序进度条组件自定义数字_微信小程序之圆形进度条(自定义组件)

    前言 昨天在微信小程序实现了圆形进度条,今天想把这个圆形进度条做成一个组件,方便以后直接拿来用. 根据官方文档自定义组件一步一步来 创建自定义组遇新是直朋能到件 第一步创建项遇新是直朋能到分览目结构 ...

  3. 微信小程序 环形进度条_微信小程序实现圆形进度条动画

    本文实例为大家分享了微信小程序动画之圆形进度条,供大家参考,具体内容如下 上图: 代码: js: //获取应用实例 var app = getApp() var interval; var varNa ...

  4. 微信小程序之圆形进度条(自定义组件)

    前言 昨天在微信小程序实现了圆形进度条,今天想把这个圆形进度条做成一个组件,方便以后直接拿来用. 根据官方文档自定义组件一步一步来 创建自定义组件 第一步创建项目结构 打开微信开发者工具创建一个项目, ...

  5. 微信小程序画布圆形进度条demo

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 正文: wxml <!--pages/test/test.wxml--> <canvas s ...

  6. 微信小程序开发学习5(自定义组件)

    微信小程序开发学习5(自定义组件) 1.学习目标 能够知道如何自定义小程序组件 能够知道小程序组件中behaviors的作用 能够知道如何安装和配置vant-weapp组件库 能够知道如何使用MobX ...

  7. Mpvue微信小程序时间消耗进度条组件的实现

    实现效果: 组件源码: 组件主要涉及时间的计算.闰年的判断,比较简单,因此注释比较少. <progress></progress>组件为微信小程序官方的进度条. <tem ...

  8. 微信小程序网悦新闻开发--自定义组件开发(六)

    目录 微信小程序网悦新闻开发--功能介绍(一) 微信小程序网悦新闻开发--小程序配置(二) 微信小程序网悦新闻开发--首页模块开发(三) 微信小程序网悦新闻开发--视频模块开发(四) 微信小程序网悦新 ...

  9. 微信小程序template模板与component自定义组件的区别和使用

    前言: 除了component,微信小程序中还有另一种组件化你的方式template模板,这两者之间的区别是,template主要是展示,方法则需要在调用的页面中定义.而component组件则有自己 ...

最新文章

  1. keras中重要的函数用法及参数详解
  2. 微型计算机的典型应用场景,单片机有哪些类型和应用场景?-MCU解决方案
  3. 红黑树模拟软件_红黑树
  4. antd如何获取表单的值_antd 父组件获取子组件中form表单的值
  5. SAP S/4HANA Analytics Path Framework 里过滤器(filter)的使用方法介绍
  6. 知乎个人精选 | 绝版的专业书到哪里找最快最高效?
  7. sql跨表查询_跨表更新,看到自己写的SQL像个憨憨
  8. LeetCode 76. 最小覆盖子串(滑动窗口)
  9. 微信公众号——永久素材的上传
  10. Go 语言泛型,简明入门教程
  11. mysql8.1改密码,mysql 8.0以上版本修改root密码的方法
  12. 1600802047 android 第三次作业(音乐播放器)
  13. linux内核之系统调用
  14. mysql中like,limit,union及union all查询
  15. 如何把TS视频文件转换为MP4格式?
  16. 如何使用奥特歌词制作双语LRC字幕
  17. 手机打开html没有图片,网页看不到图片怎么办?图片打不开的解决办法
  18. MySQL取离当前时间最近的记录
  19. APL开发日志--2012-12-03
  20. linux调整笔记本色彩,linux 调节笔记本屏幕亮度

热门文章

  1. word行中公式和文字对不齐解决办法
  2. 全球首例!这台机器人发明了两项新技术,已获专利授权!
  3. EOS区块链上EOSJS和scatter开发dApp
  4. 微软:别再使用 IE 浏览器了!
  5. 进制转换(二进制,八进制,十进制,十六进制)
  6. CSS3实现打勾(✔)效果
  7. Word2003工具栏不见了,如何恢复?
  8. 如何把html的按钮给变透明背景,css如何实现按钮透明
  9. 【小蔡】我的创作纪念日
  10. 《NFL橄榄球》:印第安纳波利斯小马·橄榄1号位