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


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 相关文章推荐
用jquery来定位
Feb 20 Javascript
jquery 模拟类搜索框自动完成搜索提示功能(改进)
May 24 Javascript
基于jquery实现的自动补全功能
Mar 12 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
Jul 11 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
May 24 Javascript
利用Three.js如何实现阴影效果实例代码
Sep 26 Javascript
原生js实现省市区三级联动代码分享
Feb 12 Javascript
vue的全局提示框组件实例代码
Feb 26 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
Apr 24 Javascript
js canvas实现写字动画效果
Nov 30 Javascript
JavaScript实现滑动门效果
Jan 18 Javascript
token 机制和实现方式
Dec 15 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
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
php缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
CMS中PHP判断系统是否已经安装的方法示例
2014/07/26 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
js版本A*寻路算法
2006/12/22 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
JS批量操作CSS属性详细解析
2013/12/16 Javascript
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
2017/06/13 jQuery
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
vue点击页面空白处实现保存功能
2019/11/06 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
python添加模块搜索路径方法
2017/09/11 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
2020/08/03 Python
HTML5-WebSocket实现聊天室示例
2016/12/15 HTML / CSS
大学生工作推荐信范文
2013/12/02 职场文书
网络管理专业求职信
2014/03/15 职场文书
医院搬迁方案
2014/06/14 职场文书
教师一帮一活动总结
2014/07/08 职场文书
经典演讲稿开场白
2014/08/25 职场文书
家庭教育的心得体会
2014/09/01 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库
Oracle数据库事务的开启与结束详解
2022/06/25 Oracle