微信小程序绘制半圆(弧形)进度条


Posted in Javascript onNovember 18, 2020

本文实例为大家分享了微信小程序绘制半圆进度条的具体代码,供大家参考,具体内容如下

wxml:

<view class="progress">
  <canvas canvas-id="canvasProgress" style="width: {{canvasWidth}}rpx; height: {{canvasHeitht}}rpx;"></canvas>
  </view>
  <view class="progress">
  <canvas canvas-id="canvasProgressReal" style="width: {{canvasWidth}}rpx; height: {{canvasHeitht}}rpx;"></canvas>
</view>

js:

Page({

 /**
 * 页面的初始数据
 */
 data: {
 canvasWidth: 500,
 canvasHeitht: 300,
 radioPos: 98,
 footNum: 0,
 footNumAll: 6000,
 myTargetFoot: 10000,
 degree: 195,
 timer: '',
 timerNum: '',
 },

 /**
 * 生命周期函数--监听页面加载
 */
 onLoad: function(options) {
 var that = this;
 let widthPX = wx.getSystemInfoSync().windowWidth;
 let r = this.data.radioPos = widthPX * (500 / 750) * (300 / 365) * (2 / 4)
 var context = wx.createCanvasContext('canvasProgress')
 context.translate(24, 6);
 context.setStrokeStyle("#fff");
 context.setLineWidth(2);
 context.beginPath();
 for (let i = 195; i >= -15; i--) { //每1度绘制一条线
  let degree = i / 360 * Math.PI * 2
  let radio = r * 0.92 - r * 0.005 * (210 - i) / 240
  context.moveTo(r + radio * Math.cos(degree), r - radio * Math.sin(degree)); //向量加减
  context.lineTo(r + r * Math.cos(degree), r - r * Math.sin(degree)); //向量加减
  context.stroke();
 }
 context.draw();



 },

 /**
 * 生命周期函数--监听页面初次渲染完成
 */
 onReady: function() {

 },

 /**
 * 生命周期函数--监听页面显示
 */
 onShow: function() {
 let that = this
 //清理
 var context = wx.createCanvasContext('canvasProgressReal')
 context.clearRect(0, 0, this.data.canvasWidth, this.data.canvasHeitht)
 context.draw({
  reserve: true
 })
 that.walkAction()
 },

 /**
 * 生命周期函数--监听页面隐藏
 */
 onHide: function() {

 },

 /**
 * 生命周期函数--监听页面卸载
 */
 onUnload: function() {

 },

 /**
 * 页面相关事件处理函数--监听用户下拉动作
 */
 onPullDownRefresh: function() {

 },

 /**
 * 页面上拉触底事件的处理函数
 */
 onReachBottom: function() {

 },

 /**
 * 用户点击右上角分享
 */
 onShareAppMessage: function() {

 },
 walkAction: function() {
 console.log('walk')
 this.setData({
  degree: 195
 })
 let that = this
 let r = this.data.radioPos
 let widthPX = wx.getSystemInfoSync().windowWidth;
 var context = wx.createCanvasContext('canvasProgressReal')
 context.clearRect(0, 0, this.data.canvasWidth, this.data.canvasHeitht)
 context.setStrokeStyle("#FDD08F");
 context.translate(24, 6);
 context.setLineWidth(2);
 let degreeMax = 195 - (this.data.footNumAll / this.data.myTargetFoot) * 240;
 if (Number.parseInt(this.data.footNumAll) >= Number.parseInt(this.data.myTargetFoot)) {
  console.log('footNumAll is smaller than myTargetFoot')
  degreeMax = -33
 }
 this.timer = setInterval(() => {
  if (that.data.degree > degreeMax) {
  context.beginPath();
  let degreeOne = that.data.degree / 360 * Math.PI * 2
  let radio = r * 0.92 - r * 0.005 * (195 - that.data.degree) / 240
  context.moveTo(r + radio * Math.cos(degreeOne), r - radio * Math.sin(degreeOne));
  context.lineTo(r + r * Math.cos(degreeOne), r - r * Math.sin(degreeOne));
  context.stroke();
  // context.draw({
  // reserve: true
  // })//这个方法真机上绘制有问题
  wx.drawCanvas({
   canvasId: 'canvasProgressReal',
   actions: context.getActions(),
   reserve: true
  })
  // that.data.degree -= 3;
  that.data.degree--;
  } else {
  clearInterval(that.timer)
  }
  // }, 50)
 }, 10)
 let tempTimes = 0;
 let times = (this.data.footNumAll / this.data.myTargetFoot) * 240 / 3;
 if (Number.parseInt(this.data.footNumAll) >= Number.parseInt(this.data.myTargetFoot)) {
  times = 80
 }
 let step = this.data.footNumAll / times
 this.timerNum = setInterval(() => {
  if (tempTimes < times) {
  that.setData({
   footNum: Math.floor(that.data.footNum + step)
  })
  tempTimes += 1;
  } else {
  that.setData({
   footNum: that.data.footNumAll
  })
  clearInterval(that.timerNum)
  }
  // }, 50)
 }, 10)
 },
})

wxss:

.progress {
 z-index: 1;
 width: 100%;
 height: 100%;
 position: absolute;
 left: 0;
 top: 0;
 display: flex !important;
 align-items: center;
 justify-content: center;
}

.progress canvas {
 width: 100%;
 height: 100%;
}

为大家推荐现在关注度比较高的微信小程序教程一篇:《微信小程序开发教程》小编为大家精心整理的,希望喜欢。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Js动态创建div
Sep 25 Javascript
Javascript 垃圾收集机制介绍理解
May 14 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
Jun 02 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
Sep 29 Javascript
node.js中的fs.readdirSync方法使用说明
Dec 17 Javascript
jQuery对象的链式操作用法分析
May 10 Javascript
Bootstrap精简教程中秋大放送
Sep 15 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
Mar 30 Javascript
vue-cli之router基本使用方法详解
Oct 17 Javascript
详解Angular调试技巧之报错404(not found)
Jan 31 Javascript
Vue组件的使用及个人理解与介绍
Feb 09 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
Aug 31 Javascript
微信小程序实现加入购物车滑动轨迹
Nov 18 #Javascript
Map与WeakMap类型在JavaScript中的使用详解
Nov 18 #Javascript
解决js中的setInterval清空定时器不管用问题
Nov 17 #Javascript
springboot+vue实现文件上传下载
Nov 17 #Vue.js
vue 表单输入框不支持focus及blur事件的解决方案
Nov 17 #Vue.js
解决vue elementUI 使用el-select 时 change事件的触发问题
Nov 17 #Vue.js
Vue项目利用axios请求接口下载excel
Nov 17 #Vue.js
You might like
php 仿Comsenz安装效果代码打包提供下载
2010/05/09 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
js event事件的传递与冒泡处理
2009/12/06 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
jQuery动画_动力节点节点Java学院整理
2017/07/04 jQuery
vue.js国际化 vue-i18n插件的使用详解
2017/07/07 Javascript
vue webuploader 文件上传组件开发
2017/09/23 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
[01:33:07]VGJ.T vs Newbee Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python实现把回车符\r\n转换成\n
2015/04/23 Python
Python的Django框架下管理站点的基本方法
2015/07/17 Python
Python生成随机验证码的两种方法
2015/12/22 Python
python实现FTP服务器服务的方法
2017/04/11 Python
python 3.5下xadmin的使用及修复源码bug
2017/05/10 Python
python GUI实现小球满屏乱跑效果
2019/05/09 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
python实现马丁策略的实例详解
2021/01/15 Python
Python页面加载的等待方式总结
2021/02/28 Python
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
Joie官方网上商店:购买服装和女装配饰
2018/06/05 全球购物
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
C#软件工程师英语面试题
2015/06/07 面试题
代理班主任的自我评价
2014/02/04 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
史上最牛的辞职信
2015/02/28 职场文书
教师工作表现自我评价
2015/03/05 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
铁人纪念馆观后感
2015/06/16 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技
MySQL自定义函数及触发器
2022/08/05 MySQL