uniapp实现大气质量指标图(app端小程序端均支持,app-nvue不支持画布)

news2025/1/13 10:27:19

效果图如下:

思路:

1.首先我想到的就是使用图标库echarts或ucharts,可是找了找没有找到类似的。

2.其次我就想用画布来实现这个效果,直接上手。(app-vue和小程序均可以实现,但是在app-nvue页面不支持画布,尝试了一下再nvue页面直接导致程序闪退)

3.后来,使用手动创建一个竖向的类似效果。

注意:

1.app-nvue页面不支持画布效果,官方说引入插件支持,但直接导致闪退。

2.map很多参数app端仅支持app-nvue页面。

方法一 使用画布进行绘制(不支持app-nvue)

<template>
	<view class="container">
		<canvas :canvas-id="canvasId" style="width: 300px; height: 300px;"></canvas>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				canvasId: "canvas",
				pollutionLevels: [{
						level: "优",
						color: "#00FF00",
						percent: 0.133,
						mark: "35"
					},
					{
						level: "良",
						color: "#FFFF00",
						percent: 0.133,
						mark: "75"
					},
					{
						level: "轻度",
						color: "#ff5500",
						percent: 0.133,
						mark: "115"
					},
					{
						level: "中度",
						color: "#FF0000",
						percent: 0.133,
						mark: "150"
					},
					{
						level: "重度",
						color: "#860000",
						percent: 0.133,
						mark: "250"
					},
					{
						level: "严重",
						color: "#510000",
						percent: 0.133,
						mark: "500"
					}
				]
			};
		},
		mounted() {
			this.drawChart();
		},
		methods: {
			drawChart() {
				const ctx = uni.createCanvasContext(this.canvasId, this);
				const startX = 0; // 图表起始位置X坐标
				const startY = 20; // 图表起始位置Y坐标
				const chartWidth = 260; // 图表宽度
				const chartHeight = 10; // 图表高度
				const textHeight = 20; // 标题高度
				const markfontSize = 10; //标点信息字体大小
				const fideWeight = 10 //减去范围坐标点的宽度
				const fideHeight = 44 //加上范围坐标点的高度
				const tdPaddingHeight = 4 //垂直距离高度
				let x = startX;
				const y = startY;
				let nextX = 0; // 下一个起始位置的x坐标

				function drawColorBlock(color, width, height) {
					ctx.setFillStyle(color);
					ctx.fillRect(x, y, width, height);
				}

				function drawText(text, width) {
					ctx.setFontSize(markfontSize);
					ctx.setFillStyle("#000000");
					const textWidth = ctx.measureText(text).width; // 计算文字宽度
					const textX = x + (width - textWidth) / 2; // 水平居中对齐
					ctx.fillText(text, textX, y - chartHeight + tdPaddingHeight); //在图表的上方
				}

				function drawMarkText(text) {
					ctx.setFontSize(markfontSize);
					ctx.setFillStyle("#000000");
					const textWidth = ctx.measureText(text).width; // 计算文字宽度
					const textX = startX + nextX - fideWeight - textWidth / 2; // 水平居中对齐
					if (text === "0") {
						ctx.fillText("0", startX, y - textHeight + fideHeight);
					} else {
						ctx.fillText(text, textX + 10, y - textHeight + fideHeight);
					}
				}
				this.pollutionLevels.forEach(level => {
					const width = chartWidth * level.percent;
					nextX = x + width; // 记录下一个起始位置的x坐标
					// 绘制颜色区块
					drawColorBlock(level.color, width, chartHeight);
					// 绘制标题
					drawText(level.level, width);
					drawMarkText(level.mark);
					if (level.level==='优') {
						drawMarkText("0");
						drawMarkText(level.mark);
					}
					x = nextX; // 更新起始位置的x坐标
				});
				ctx.draw();
			}
		}
	}
</script>

实现效果图如下

方法二 使用盒子创建竖向对应(比较笨拙,但是app-nvue页面只能这样来实现了)

这里我封装了一个方法

组件代码

<template>
	<view class="legend-section">
		<view class="rowlist" v-for="(item,index) in list" :key="index">
			<view class="bgColor" :style="{'width':'50rpx','height':'20rpx','background-color':item.bgColor}"></view>
			<view class="mark"><text style="font-size: 22rpx;">{{item.mark}}</text></view>
		</view>
	</view>
</template>

<script>
	export default {
		props: {
			legendList: {
				type: [Array],
				default: () => []
			},
		},
		data() {
			return {
				list: []
			}
		},
		watch: {
			legendList: {
				handler: function(newVal) {
					const datas = JSON.parse(newVal)
					datas.forEach((ele) => {
						if (ele.mark === '优') {
							ele.bgColor = "#00FF00"
						} else if (ele.mark === '良') {
							ele.bgColor = "#FFFF00"
						} else if (ele.mark === '轻度') {
							ele.bgColor = "#ff5500"
						} else if (ele.mark === '中度') {
							ele.bgColor = "#FF0000"
						} else if (ele.mark === '重度') {
							ele.bgColor = "#860000"
						} else if (ele.mark === '严重') {
							ele.bgColor = "#510000"
						} else if (ele.mark === '离线') {
							ele.bgColor = "#818181"
						} 
					})
					this.list = datas
				},
				deep: true, // 深度监听
				immediate: true // 立即执行
			}
		},
	}
</script>

<style lang="scss" scoped>
	.legend-section {
		border-radius: 2rpx;
		padding: 10rpx;
	}

	.rowlist {
		display: flex;
		flex-flow: row nowrap;
		align-items: center;
		justify-content: flex-start;
		margin: 10rpx 12rpx;
	}

	.mark {
		padding-left: 10rpx;
	}
</style>

调用组件

	<cover-view class="maplegend-list" v-if="legendFlag">
				<legend :legend-list="legendList"></legend>
			</cover-view>

//数据初始化
	legendList: [], //图例信息

//传入数据
	this.legendList = JSON.stringify(legendList.data) //图例信息  

实现效果如下

总而言之,app-nvue页面有很大的性能提升,但总会牺牲一些东西来弥补。app-nvue页面css很多有局限性,仔细阅读文档。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Node.js】数据库配置与操作、Session实现原理、JWT实现原理:

文章目录 一、数据库配置与操作【1】 数据库的基本操作【2】 使用 mysql 模块操作 MySQL 数据库 二、Session实现原理【1】HTTP 协议的无状态性【2】Cookie【3】Session 的工作原理【3】在 Express 中使用 Session 认证 三、JWT实现原理【1】JWT 的工作原理【2】JWT 的组成部分…

金融风控建模常用指标介绍(WOE, IV, KS, PSI)

金融风控建模常用指标介绍&#xff08;WOE, IV, KS, PSI&#xff09; 近期在做金融风控相关项目&#xff0c;有必要把特征和模型的衡量指标总结下&#xff0c;以备不时之需。这次主要介绍4个指标&#xff08;WOE, IV, KS, PSI&#xff09;。 WOE&#xff08;Weight of Evidenc…

嵌入式学习笔记(28)按键和CPU的中断系统

按键的物理特性 (1)、平时没人按的时候&#xff0c;弹簧把按键按钮弹开。此时内部断开的。 (2)、有人按下的时候&#xff0c;手的力量克服弹簧的弹力&#xff0c;将按钮按下&#xff0c;此时内部保持接通&#xff08;闭合&#xff09;状态&#xff1b;如果手拿开&#xff0c;…

无涯教程-JavaScript - COS函数

描述 COS函数返回给定Angular的余弦值。 语法 COS (number)争论 Argument描述Required/OptionalNumber The angle in radians for which you want the cosine.Required Notes 如果Angular以度为单位,则将Angular乘以PI()/180或使用RADIANS函数将Angular转换为弧度 弧度(…

汉威科技亮相2023上海传感器展,智能传感新品引关注

作为全球三大传感器展之一的中国&#xff08;上海&#xff09;国际传感器技术与应用展览会&#xff0c;被誉为全球传感器行业发展的风向标&#xff0c;每届展会都会展出数以万计的行业尖端传感新技术和新产品。今年&#xff0c;第8届中国&#xff08;上海&#xff09;国际传感器…

强大的Druid

一 基本原理 一次数据库访问总共分几步&#xff1f;三步&#xff1a;第一步是创建一个连接&#xff1b;第二步是操作数据&#xff1b;第三步是释放连接。对于一个业务动作来说&#xff0c;我们并不关心第一步和第三步&#xff0c;我们真正关心的是第二步——操作数据。为了做一…

51单片机智能小车之蓝牙控制并测速小车、wife控制小车、4g控制小车、语音控制小车

目录 1. 蓝牙控制小车 2. 蓝牙控制并测速小车 3. wifi控制测速小车 4. 4g控制小车 5. 语音控制小车 1. 蓝牙控制小车 使用蓝牙模块&#xff0c;串口透传蓝牙模块&#xff0c;又叫做蓝牙串口模块 串口透传技术&#xff1a; 透传即透明传送&#xff0c;是指在数据的传输过…

想了解软件测试生命周期知识吗?

一、软件测试的目的 1.基于不同的立场&#xff0c;存在着两种完全不同的测试目的。 2.从用户的角度出发&#xff0c;普遍希望通过软件测试暴露软件中隐藏的错误和缺陷&#xff0c;以考虑是否可接受该产品。 3.从软件开发者的角度出发&#xff0c;则希望测试成为表明软件产品…

【Python保姆级教程】List容器

文章目录 前言一、列表是什么二、列表的定义2.1 有初始值2.2 空列表使用方括号创建空列表使用list()函数创建空列表 三、list列表常用操作3.1 添加元素3.2 删除元素3.3 修改元素3.4 列表长度 四、遍历操作4.1 使用for循环4.2 使用while循环和索引 总结 前言 Python是一种广泛使…

Python傅立叶变换

1. 什么是傅里叶变换&#xff1f; 在数学中&#xff0c;变换技术用于将函数映射到与其原始函数空间不同的函数空间。傅里叶变换时也是一种变换技术&#xff0c;它可以将函数从时域空间转换到频域空间。例如以音频波为例&#xff0c;傅里叶变换可以根据其音符的音量和频率来表示…

在项目中,关于前端实现数据可视化的技术选择

前言 在项目中&#xff0c;数据可视化以图表、报表类型为主。 需求背景 技术框架是Vue2.x版本&#xff0c;组件库是Ant Design of Vue能够支撑足够多的图表类型开发图表大小/位置能够随意变动图表样式需要支持丰富多样的用户配置强大、开放的图表语法支持复杂的数据可视化场景…

「UG/NX」Block UI 指定平面SpecifyPlane

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

linux内核分析:线程和进程创建,内存管理

lec18-19:进程与线程创建 lec20-21虚拟内存管理 内核代码,全局变量这些只有一份,但是内核栈有多份,这可能就是linux线程模型1对1模式的由来。通过栈来做的 x86 CPU支持分段和分页(平坦内存模式)两种 分段,选择子那里就有特权标记了

C#教师考勤管理系统asp.net+sqlserver

3.3.1 员工部分 1&#xff1a;请假管理&#xff1a;包括填写请假条&#xff0c;提交申请&#xff0c;查看审批&#xff0c;审核请假等等。 2&#xff1a;考勤管理&#xff1a;针对具体的员工考勤的统计等管理。 3&#xff1a;个人资料管理&#xff1a;进行个人信息管理&#xf…

接口测试——接口协议抓包分析与mock_L1

目录&#xff1a; 接口测试价值与体系常见的接口协议接口测试用例设计postman基础使用postman实战练习 1.接口测试价值与体系 接口测试概念 接口&#xff1a;不同的系统之间相互连接的部分&#xff0c;是一个传递数据的通道接口测试&#xff1a;检查数据的交换、传递和控制…

每日一博 - WebHook vs Polling

文章目录 概述图解 概述 下面的图表显示了轮询和Webhook之间的比较。 假设我们运行一个电子商务网站。客户通过API网关将订单发送到订单服务&#xff0c;然后订单服务将订单传递给支付服务进行支付交易。支付服务然后与外部支付服务提供商&#xff08;PSP&#xff09;通信&am…

Python 列表的下标索引

视频版教程 Python3零基础7天入门实战视频教程 我们可以通过列表的下标索引获取列表元素。 下标索引从0开始&#xff0c;第一个元素下标索引是0&#xff0c;第二个元素下标索引是1&#xff0c;…第N个元素下标索引是N-1 举例&#xff1a; # 定义一个有多元素的列表 list1 …

数据库系统外部的体系结构

单用户结构主从式结构分布式结构客户机&#xff0f;服务器结构&#xff08;C/S结构&#xff09;浏览器 / 服务器结构&#xff08;B/S结构&#xff09;感谢 &#x1f496; 上一篇文章 数据库系统的三级模式和二级映射介绍的是数据库系统内部的体系结构&#xff0c;是从应用开发…

端口敲击守护程序之DC-9

OSCP系列靶场-Intermediate-DC-9 目录 OSCP系列靶场-Intermediate-DC-9总结准备工作信息收集-端口扫描目标开放端口收集目标端口对应服务探测 信息收集-端口测试80-HTTP端口的信息收集信息收集-网站指纹漏洞利用-网站指纹(无)信息收集-HTML隐藏信息查看信息收集-目录扫描信息收…

C语言 —— 初步入门知识(内存、指针、结构体)

本篇文章将接着上篇继续介绍C语言的基础知识&#xff0c;那么对于C语言大部分初学者会觉得难以理解&#xff0c; 所以作者将指针单独拿出来写篇较短的文章进行讲解。 1.指针 1.1 内存 要学习指针&#xff0c;就先要了解内存。一起来看。 内存是计算机中的关键组成部分&#xff…