微信小程序制作圆形进度条

微信小程序制作圆形进度条

image

1. 建立文件夹

选择一个目录建立一个文件夹,比如 mycircle 吧,另外把对应 page 的相关文件都建立出来,包括 js,json,wxml 和 wxcc。

image

2. 开启元件属性

在 mycircle.json中开启 component 属性,确定我们这个页面是一个可被调用的元件。

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

3. 建立 XML 样式

在 mycircle.wxml文件中设计空间的样式及接口参数,也要注意一下 wxss 文件的样式配合。

wxml 文件内容为:

<view class="circle_box" style="width:{{size}}px;height:{{size}}px">
      <canvas class="circle_bg" canvas-id="{{draw}}bg" style="width:{{size}}px;height:{{size}}px"></canvas> 
      <canvas class="circle_draw" canvas-id="{{draw}}" style="width:{{size}}px;height:{{size}}px"></canvas> 
      <text class='circle_txt'> {{txt}}%  </text>  
</view>

4. 在 js 文件中实现代码

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();//数值变化是所有重绘
		}
	  }
  
	},

其中,observer 函数会在组件的属性发生变化时被调用,调用后会打印一些调试信息,最终调用的是 onreset 函数。

接下来看看 onreset 函数的内容:(这个在生命周期函数中也需要调用来刷新界面)

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, //这里将 0-100 转换为 0-2
				txt: _this.data.per
			});


			//获取屏幕宽度(并把真正的半径px转成rpx)
			let rpx = (_this.data.screenWidth / 750) * r; //真正的半径
			//计算出画板大小
			this.setData({
				size: rpx * 2  //实际窗口的大小
			});
			const w = 10;//圆形的宽度

			//组件入口,调用下面即可绘制 背景圆环和彩色圆环。
			_this.drawCircleBg(el + 'bg', rpx, w);//绘制 背景圆环
			_this.drawCircle(el, rpx, w, _this.data.step);//绘制 彩色圆环

		}

onreset 函数主要功能是根据组件属性的新值来重新绘制 canvas,首先获取屏幕宽度,以便于计算相对的组件大小,从而适应更多种类的屏幕。

最后将参数进行转换,比如百分比转换成 0-2 之间的浮点数等。

最终设定圆形的宽度后调用 drawCircle 和 drawCircleBg 两个函数来分别绘制前景图和背景图。

背景图的绘制只是绘制一个灰色的圆环,代码相对简单,这里使用了最新的 canvas API 接口:

drawCircleBg: function (el, r, w) {
			const query = wx.createSelectorQuery().in(this);
			//wx.createSelectorQuery()
				query.select('#' + el) // 在 WXML 中填入的 id
				.fields({ node: true, size: true })
				.exec((res) => {

					const canvas = res[0].node;
					const ctx = canvas.getContext('2d');

					// Canvas 画布的实际绘制宽高
					const width = res[0].width
					const height = res[0].height
		
					// 初始化画布大小
					const dpr = wx.getWindowInfo().pixelRatio
					canvas.width = width * dpr
					canvas.height = height * dpr
					ctx.scale(dpr, dpr)

					//绘制前清空画布,原点 + 长和宽,这里画圆,因此清零 2r 的方块
					ctx.clearRect(0, 0, 2 * r, 2 * r);
					ctx.lineWidth = w;                  // 设置圆环的宽度
					ctx.strokeStyle = '#E5E5E5';        // 设置圆环的颜色
					ctx.lineCap = 'round';            // 设置圆环端点的形状
					ctx.beginPath();                     //开始一个新的路径

					// r,r为原点,r-w 为半径,从 0 弧度到 2pi 弧度,顺时针(false)画弧度。
					ctx.arc(r, r, r - w, 0, 2 * Math.PI, false); //设定路径

					ctx.stroke();//对当前路径进行描边,真正的画

				}); // */
		},

这里一下几点注意:

  1. 查找组件要是用‘#’开头 ,这是新的属性定义的。
  2. query = wx.createSelectorQuery().in(this); 这里要是用 in(this)确保在 ready 期间可以找到组件。
  3. 一定要初始化画布大小,否则按照默认大小画出来的会变形。
  4. canvas 的一些方法变成了属性,比如原来的 SetLineWidth 变成了 lineWidth,注意大小写。

最后我们看一下前景图的绘制

drawCircle: function (el, r, w, step) {
		
			const query = wx.createSelectorQuery().in(this);
			//wx.createSelectorQuery()
			query.select('#' + el) // 在 WXML 中填入的 id
				.fields({ node: true, size: true })
				.exec((res) => {

					const canvas = res[0].node;
					const context = canvas.getContext('2d');

					// Canvas 画布的实际绘制宽高
					const width = res[0].width
					const height = res[0].height
		
					// 初始化画布大小
					const dpr = wx.getWindowInfo().pixelRatio
					canvas.width = width * dpr
					canvas.height = height * dpr
					context.scale(dpr, dpr)
                  
					context.clearRect(0, 0, 2 * r, 2 * r);
					// 设置渐变
					var gradient = context.createLinearGradient(2 * r,2 * r, 0,0);
					gradient.addColorStop("0", "#2661DD");
					gradient.addColorStop("0.5", "#40ED94");
					gradient.addColorStop("1.0", "#5956CC");
				
					context.lineWidth = w;         // 设置现线的宽度
					context.strokeStyle = gradient; //设置颜色为渐变
					context.lineCap = 'round';         //设置端点形状
					context.beginPath();//开始一个新的路径
					// step 从0到2为一周,注意 canvas 的坐标方向,从-90°划到正的 270°
					context.arc(r, r, r - w, -Math.PI / 2, step * Math.PI - Math.PI / 2, false);
					//context.stroke();           //对当前路径进行描边
					step ? context.stroke() : ''; //当step为空的时候不画(0%)
				})//  */
		},

前景图的绘制区别于背景图,它使用了渐变颜色,同时我们会根据参数中的 step 来进行特定角度的弧线的绘制。

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/533462.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法——字符串暴力匹配

一、字符串的组成 1.数据域&#xff0c;字符串的内容 2.字符串的长度 二、模式匹配-暴力匹配原理 1.两个字符串一个主串一个模式串用两个指针对其进行匹配 2、两个指针所对应的值相同时继续匹配下一个 3、当出现不匹配的情况时&#xff0c;回溯主串的指针到刚开始起点的下一个位…

大气负氧离子自动监测系统

TH-FZ4随着旅游旺季的到来&#xff0c;越来越多的人选择走出家门&#xff0c;感受大自然的魅力。然而&#xff0c;在享受美丽风景的同时&#xff0c;我们是否也关注到了身边空气质量的变化&#xff1f;今天&#xff0c;就让我们一起了解一种神奇的监测系统——大气负氧离子自动…

【STL】list的模拟实现

目录 前言 list概述 list的节点 list的迭代器 list的结构 构造与析构 拷贝构造与赋值 list的元素操作 insert() push_back() push_front() erase() pop_back() pop_front() clear() swap() size() 完整代码链接 前言 如果你对链表还不熟悉或者忘了的话…

手机银行客户端框架之mPaaS介绍

移动开发平台&#xff08;Mobile PaaS&#xff0c;简称 mPaaS&#xff09;是源于支付宝 App 的移动开发平台&#xff0c;为移动开发、测试、运营及运维提供云到端的一站式解决方案&#xff0c;能有效降低技术门槛、减少研发成本、提升开发效率&#xff0c;协助企业快速搭建稳定…

Harmony鸿蒙南向驱动开发-SPI

SPI即串行外设接口&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。SPI是由Motorola公司开发&#xff0c;用于在主设备和从设备之间进行通信。 运作机制 在HDF框架中&#xff0c;SPI的接口适配模…

#5松桑前端后花园周刊-JavaScript引擎和JavaScript运行时之间的区别

行业动态 TC39 Signals 提案 一个早期提案&#xff1a;给 ECMAScript/JavaScript 带来一个新特性 signals&#xff0c;该提案从一系列流行的框架中引入了一些想法。提案解释 signals 是一种数据类型&#xff0c;它通过模拟状态单元和从其他状态/计算中派生的计算来实现单向数…

免费ssl证书能一直续签吗?如何获取SSL免费证书?

免费SSL证书是否可以一直续签。我们需要了解SSL证书的基本工作原理。当你访问一个使用HTTPS协议的网站时&#xff0c;该网站实际上在使用一个SSL证书。这个证书相当于一个数字身份证明&#xff0c;它验证了网站的真实性和安全性。而这个证明是由受信任的第三方机构——通常是证…

jvm中jdk常用的几个命令总结

1.jmap 此命令可以用来查询内存信息&#xff0c;实例个数及占用内存大小 1.1 查看堆内存概要信息&#xff08;内存分配统计&#xff09; jmap -histo[:live] <pid> .-histo&#xff1a;显示堆中对象的统计信息&#xff0c;包括每个类的实例数量、占用内存大小等 :live…

Vue+el-table 修改表格 单元格横线边框颜色及表格空数据时边框颜色

需求 目前 找到对应的css样式进行修改 修改后 css样式 >>>.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F !important;}>>>.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F …

【开源社区】openEuler、openGauss、openHiTLS、MindSpore

【开源社区】openEuler、openGauss、openHiTLS、MindSpore 写在最前面开源社区参与和贡献的一般方式开源技术的需求和贡献方向 openEuler 社区&#xff1a;开源系统官方网站官方介绍贡献攻略开源技术需求 openGauss 社区&#xff1a;开源数据库官方网站官方介绍贡献攻略开源技术…

机器学习和深度学习--李宏毅 (笔记与个人理解)Day7

Day7 Regression Case study &#xff08;预测宝可梦的cp&#xff09; Regression 可以做什么&#xff1f; 股票预测 自动驾驶 推荐 预测宝可梦的cp&#xff08;能力类似这样的属性把&#xff09; 这里突然想到&#xff0c;是不是可以用洛克王国和赛尔号做事情哈哈 注意&#…

解决苹果iMac的M1芯片Node Sass does not yet support your current environment的问题

问题背景 如图所示&#xff0c;这是我的电脑&#xff0c;M1芯片 启动前端项目老是报错&#xff0c;说node Sass不支持我当前的环境&#xff0c;同事的macBook是intel芯片的&#xff0c;就能跑起项目来 很烦 但是不慌&#xff01;&#xff01;&#xff01; 咱有解决方法啦&a…

【C 数据结构】线性表

文章目录 【 1. 线性表 】【 2. 顺序存储结构、链式存储结构 】【 3. 前驱、后继 】 【 1. 线性表 】 线性表&#xff0c;全名为线性存储结构&#xff0c;线性表结构存储的数据往往是可以依次排列的&#xff08;不考虑数值大小顺序&#xff09;。 例如&#xff0c;存储类似 {1…

Visual Studio C++ 正确创建项目与更改文件名

1、创建项目 1&#xff09;打开Visual Studio&#xff0c;选择创建新项目。 2&#xff09;创建空项目 3&#xff09;配置新项目&#xff0c;注意不要勾选 " 将解决方案和项目放在同一目录中 " 。并将位置的文件夹设为与解决方案同名&#xff0c;方便管理。项目名称则…

客户关系CRM管理系统源码 企业crm管理系统

客户关系CRM管理系统源码 企业crm管理系统 系统功能介绍 1、 公海管理&#xff1a;公海类型、客户公海。 2、 线索管理&#xff1a;我的线索、线索列表、线索状态、线索来源。 3、 客户管理&#xff1a;我的客户、客户列表、成交客户、行业类别、预查、地区列表、客户状态、…

Docker Compose 一键安装

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

SOCKS代理是如何增强网络隐私?

在数字化时代&#x1f310;&#xff0c;网络隐私的重要性日益凸显。个人和组织都在寻找有效的方法来保护自己的网络活动不受侵犯。SOCKS代理作为一种流行的网络协议&#xff0c;提供了一种有效的手段来增强网络隐私。本文将详细介绍SOCKS代理是如何工作的&#xff0c;以及它是如…

BPMN.JS中文教程学习

基础篇 vue bpmn.js 建模BpmnModeler将数据转图形bpmnModeler.importXML // basic.vue<script>// 引入相关的依赖import BpmnModeler from bpmn-js/lib/Modelerimport {xmlStr} from ../mock/xmlStr // 这里是直接引用了xml字符串export default {name: ,components: {…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.3 月末操作:外币评估

2.6.3 月末操作&#xff1a;外币评估 企业的外币业务在记账时一般使用期初的汇率或者即时汇率&#xff0c;但在月末&#xff0c;需要按照月末汇率对外币的余额或者未清项进行重估&#xff08;revaluation&#xff09;。 企业在资产负债表日&#xff0c;应当按照下列规…

二百三十、MySQL——MySQL表的索引

1 目的 梳理一下目前MySQL维度表的索引情况&#xff0c;当然网上也有其他博客专门讲MySQL索引的&#xff0c;我这边只是梳理一下目前的索引状况而已 2单列索引 2.1 索引截图 2.2 建表语句 3 联合索引 3.1 索引截图 3.2 建表语句 4 参考的优秀博客 http://t.csdnimg.cn/ZF7…