Echarts圆环图实现进度条末尾带一个方块的效果

news/2025/3/10 21:28:35/文章来源:https://www.cnblogs.com/Pkernel/p/18763717


效果这样
直接上代码吧

<template><div ref="chartDom" style="width: 260px; height: 460px; background-color: white"></div>
</template><script setup lang="ts">
// import { useI18n } from 'vue-i18n'
// import { useQuasar } from 'quasar'
import * as echarts from 'echarts'
import { computed, nextTick, onMounted, ref, useTemplateRef } from 'vue'// const { t } = useI18n()
const chartDom = useTemplateRef('chartDom')
let chartInstance: echarts.ECharts | null = null
let data = 0
const domHeight = ref(0)
const domWidth = ref(0)
const blockHeight = ref(4) // 小白块长度
const blockWidth = ref(50) // 小白块宽度 (比下面那个加2就行)
const progressWidth = ref(48)
const name = ref('示例数据')
const radius = computed(() => ((domHeight.value > domWidth.value ? domWidth.value : domHeight.value) * 0.75) / 2,
) // 图形的半径
const pi = Math.PI // ≈3.141592653589793onMounted(async () => {await nextTick()chartInstance = echarts.init(chartDom.value)if (!chartDom.value) {console.error('Chart DOM element is not available')return}domHeight.value = chartInstance.getHeight()domWidth.value = chartInstance.getWidth()const option: echarts.EChartsOption = {series: [{type: 'gauge',center: ['50%', '60%'],startAngle: 180,endAngle: 0,min: 0,max: 100,splitNumber: 1,itemStyle: {color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{ offset: 1, color: '#ffffff' }, // 渐变色的开始颜色{ offset: 0, color: '#f7b733' }, // 渐变色的结束颜色]),},progress: {show: true,width: progressWidth.value,},pointer: {show: false,},axisLine: {lineStyle: {width: progressWidth.value,},},axisTick: {distance: 0,splitNumber: 5,lineStyle: {width: 2,color: '#999',},show: false,},splitLine: {distance: -52,show: false,length: 14,lineStyle: {width: 3,color: '#999',},},axisLabel: {distance: 40,padding: [10, -5, 0, 0],height: 40,width: 20,color: '#999',fontSize: 12,lineHeight: 56,rich: {a: {// 没有设置 `lineHeight`,则 `lineHeight` 为 56},},},anchor: {show: false,},title: {show: true,color: '#999',fontSize: 10,offsetCenter: [0, 15],},detail: {valueAnimation: true,width: '20%',lineHeight: 40,borderRadius: 8,offsetCenter: [0, '-6%'],fontSize: 18,fontWeight: 'bolder',formatter: '{value}%',color: 'black',}, //百分比那一行的data: [{name: name.value,value: data,},], //title那里的显示name是在这里,百分比值也是这个value来决定的},],graphic: [{id: 'endBlock',type: 'rect',shape: {width: blockWidth.value,height: blockHeight.value,r: [2, 2, 2, 2],}, //长宽zlevel: 100,style: {fill: '#FFFFFF',shadowColor: '#999999',shadowBlur: 2,},originX: radius.value + 1,originY: 0,// position: [19, 95], // 初始占位坐标x: (domWidth.value - radius.value * 2) / 2 - (blockWidth.value % 2 != 0 ? 0 : 1),y: domHeight.value * 0.6, //因为上面center那里Y轴是在60%,需要自己调整transition: ['rotation'],rotation: 0,},],}chartInstance.setOption(option)chartInstance.setOption({series: [{data: [{name: name.value,value: data,},],},],graphic: [{id: 'endBlock',rotation: 0, // 方向修正},],})setInterval(function () {data = +(Math.random() * 60).toFixed(2)if (chartInstance) {chartInstance.setOption({series: [{data: [{name: name.value,value: data,},],},],graphic: [{id: 'endBlock',rotation: -((data / 100) * pi) - 0.01, // 方向修正},],})}}, 2000)
})
</script>

setOptions第二次是因为要处理白块跟进度条初始化时不同步的问题,echarts我不是特别熟,不知道有没有别的办法。只能用笨方法了
翻echarts官方没找到特别相符的,百度也只找到了那种圆球实现,如果又更好的实现也麻烦评论区回复一下,感谢

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF2068E. Porto Vs. Benfica

Porto Vs. Benfica 翻译自官方题解。我们首先做一些定义,这将帮助我们: 定义。 用 \(f(v)\) 表示支持者俱乐部从顶点 \(v\) 出发,想要到达顶点 \(n\) 所需的最少道路数,且警察仍然可以封锁恰好一条道路。 因此,\(f(1)\) 是问题的答案,且 \(f(n) = 0\)。 定义。 用 \(g(v,…

使用 Power Automate发送图文并茂的Teams消息

前言最近,有朋友使用Automate发送Teams消息,发现如果图片在SharePoint中,发送的时候因为认证的问题图片没办法显示。其实,我们可以将图片转换成Base64流进行引用,就能正常的显示了。正文1.我们新建一个Automate Flow,如下图:2.然后,添加Teams操作,如下图:3.消息我们需…

006TypeScript开发实战

一、全家桶-状态管理 状态管理的选择 vuex:目前依然使用较多的状态管理库 pinia:强烈推荐,未来趋势的状态管理库(用这个)1、 安装:npm install pinia 安装完成 2、新建文件夹 这里这样写 这里引入pinia 新建文件 这样写 这里引用一下 可以看到页面上 点击之后变成

《Python极客项目编程(第2版)》 | PDF免费下载 | epub free download

本书并不介绍Python语言的基础知识,而是通过一系列有趣的项目,展示如何用Python解决各种实际问题,以及如何使用一些流行的Python库。点击下载书籍信息 作者: [美] 马赫什文基塔查拉姆(Mahesh Venkitachalam) 出版社: 人民邮电出版社 原作名: Python Playground: Geeky Pro…

课堂教学质量评价分析系统 AI+教育

课堂教学质量评价分析系统的核心技术基于YOLOv11和CNN算法,课堂教学质量评价分析系统检测到的行为数据(如玩手机、举手、睡觉、交头接耳、趴桌子、行走运动)和表情数据(如开心、厌恶、愤怒、悲伤、沮丧、恐惧、无表情)会被传递到情感模型进行进一步分析。同时,系统还会结…

04. 串口通信

一、串口通信简介串口通信是一种设备间常用的串行通信方式,串口按位(bit)发送和接收字节。串口通信的数据包由发送设备的 TXD 接口传输到接收设备的 RXD 接口。在串口通信的协议层中,规定了数据包的内容,它由起始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式…

【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享

问题描述 当在AKS中遇见复杂的网络问题,想要进入到特定的POD中来抓取网络文件包进行分析。特分享抓取网络包的方法!操作步骤 第一步:使用kubectl get pods命令确认问题Pod所在的Node 第二步:使用node shell登录到相应node上 kubectl node-shell <node name> 第三步:…

App虚拟机环境搭建

App虚拟机环境搭建 在uniapp的开发环境中,我想要搭建一个平台完成对于app的开发,所以要配置app的基本环境和安装虚拟机 虚拟机安装 这里使用Mumu虚拟机.直接从官网下载然后傻瓜式安装https://mumu.163.com/搭建环境 主要是给虚拟机的接口和abd.exe文件的地址找到,配置到HBuilde…

nodejs的下载安装

首先进入官网https://nodejs.cn/download/ 左边是稳定版,右边是最新版,安装自己想要的版本 安装到自己想要的路径下 一直next,这步不要勾选 然后install 在安装路径下创建两个文件夹,分别是node_cache和node_global 配置环境变量 再在系统path中添加%NODE_HOME%、%NODE_HOM…

安卓虚拟机的创建

在android studio上创建一个安卓虚拟机 可以选择手机型号 可选的都是谷歌的手机 而且对应的ui都是原生安卓ui 随便选就好 记得安卓版本不要太老,没必要虚拟机运行起来之后就会在边上有个视图

android studio的下载

进入android studio官网下载即可,中间所有东西点同意和next就行

Vue3--ref - reactive

reactive可以深层次对比ref定义对象类型是借用reactive总结