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


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代码同步文本框内容的实例方法
Jul 12 Javascript
jsPDF导出pdf示例
May 02 Javascript
Bootstrap Modal遮罩弹出层代码分享
Nov 21 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
Nov 25 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
Dec 08 Javascript
javascript基于原型链的继承及call和apply函数用法分析
Dec 15 Javascript
es6基础学习之解构赋值
Dec 10 Javascript
electron实现静默打印的示例代码
Aug 12 Javascript
node.js制作一个简单的登录拦截器
Feb 10 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
Mar 12 Javascript
Vue+tracking.js 实现前端人脸检测功能
Apr 16 Javascript
vue实现树状表格效果
Dec 29 Vue.js
微信小程序实现加入购物车滑动轨迹
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
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
将PHP的session数据存储到数据库中的代码实例
2016/06/24 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
JavaScript Cookie显示用户上次访问的时间和次数
2009/12/08 Javascript
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
2015/08/22 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
Bootstrap select实现下拉框多选效果
2016/12/23 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
webpack项目轻松混用css module的方法
2018/06/12 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
Python中协程用法代码详解
2018/02/10 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
2018/04/02 Python
Django项目中添加ldap登陆认证功能的实现
2019/04/04 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
python中rc1什么意思
2020/06/19 Python
Python实现曲线拟合的最小二乘法
2021/02/19 Python
运动会广播稿400字
2014/01/25 职场文书
40岁生日感言
2014/02/15 职场文书
党委班子剖析材料
2014/08/21 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
python实现简易名片管理系统
2021/04/11 Python
Matlab如何实现矩阵复制扩充
2021/06/02 Python
Python函数中的不定长参数相关知识总结
2021/06/24 Python