canvas绘制仪表盘刻度盘

canvas画布可以实现在网页上绘制图形的方法,比如图表、图片处理、动画、游戏等。今天我们在vue模板下用canvas实现仪表盘的绘制。

对canvas不熟悉的同学可以先了解下canvas的API文档:canvas API中文网 - Canvas API中文文档首页地图

一、创建模板,创建canvas标签

<template><canvas ref="gauge"></canvas>
</template><script>
export default {name: 'Gauge',data() {return {width:220,    // 画布的宽度height:220,   // 画布的高度progress:0.6  // 值-进度}},mounted(){this.draw()},methods:{draw(){}},
}
</script>

二、初始化画布,并绘制背景圆弧

    draw(){// 获取canvas元素和上下文let canvas = this.$refs.gaugelet ctx = canvas.getContext("2d")// 获取设备像素比,解决移动端显示锯齿、模糊等问题const dpr = window.devicePixelRatio || 1canvas.style.width = this.width + "px"canvas.style.height = this.height + "px"canvas.height = this.height * dprcanvas.width = this.width * dprctx.scale(dpr, dpr)// 清除画布--更新画布前需要清除之前的画布内容ctx.clearRect(0, 0, canvas.width, canvas.height)// 圆心位置-宽高的一半const centerX = this.width / 2const centerY = this.height / 2const startAngle = (3 * Math.PI) / 4   // 仪表盘的初始角度const endAngle = Math.PI / 4           // 仪表盘的结束角度const totalAngle = (3 * Math.PI) / 2   // 仪表盘的总角度// 绘制背景圆弧ctx.beginPath()ctx.arc(centerX, centerY, (this.width-20)/2, startAngle, endAngle)ctx.lineWidth = 16ctx.lineCap = 'round'ctx.strokeStyle = '#FAFAFA 'ctx.stroke()}

详解:

1、仪表盘的初始角度、结束角度、总角度根据你需要的弧形进行配置。

可以参照arc api 的此图进行理解。

角度

180

270

360

初始角度

1 * Math.PI

(3 * Math.PI) / 4

0.5 * Math.PI

结束角度

0

Math.PI / 4

-0.5 * Math.PI

总角度

1 * Math.PI

(3 * Math.PI) / 2

2 * Math.PI

2、lineCap:设置或返回线条的结束端点样式;

butt

默认。向线条的每个末端添加平直的边缘。

round

向线条的每个末端添加圆形线帽。

square

向线条的每个末端添加正方形线帽。

三、绘制上层圆弧

      // 绘制上层圆弧const endAngle1 = startAngle + (totalAngle * this.progress)ctx.save()ctx.beginPath()ctx.arc(centerX, centerY, (this.width-20)/2, startAngle, endAngle1)ctx.lineWidth = 16ctx.lineCap = 'round'var gradient = ctx.createLinearGradient(0, this.height/2*Math.sqrt(2), this.width/2*Math.sqrt(2), 0);gradient.addColorStop(0, '#DDF5EC');gradient.addColorStop(1, '#04FACF');ctx.strokeStyle = gradientctx.stroke()

详解:

1、颜色设置渐变,渐变色x轴、y轴的起点和终点。根据勾股定理计算为半径的平方根。

四、绘制刻度、刻度值

      // 绘制刻度ctx.save()// 将原点移到圆心处ctx.translate(centerX, centerY)const numTicks = 100 // 刻度数量let tickLength = 0  // 刻度长度let tickWidth = 0 // 刻度宽度const scaleRadius = (this.width-50)/2   // 刻度半径let angleStep = totalAngle / numTicksfor (let i = 0; i <= numTicks; i++) {let angle = startAngle + (i * angleStep)if (i % 10 == 0) {tickWidth = 1*2   // 长刻度线的宽是小刻度的2倍tickLength = 6*1.5   // 长刻度线的长是小刻度的1.5倍} else {tickWidth = 1tickLength = 6}ctx.beginPath();ctx.lineWidth = tickWidthctx.strokeStyle = '#cccccc'// 计算刻度起点和终点的坐标let startX = (scaleRadius - tickLength) * Math.cos(angle)let startY = (scaleRadius - tickLength) * Math.sin(angle)let endX = (scaleRadius) * Math.cos(angle)let endY = (scaleRadius) * Math.sin(angle)// 绘制刻度线段ctx.moveTo(startX, startY)ctx.lineTo(endX, endY)ctx.stroke()// 绘制刻度值文本let text = i % 10 == 0 ? i : ''let textX = (scaleRadius - 20) * Math.cos(angle)let textY = (scaleRadius - 20) * Math.sin(angle)ctx.font = "12px Arial"ctx.fillStyle = '#666666'ctx.textAlign = "center"ctx.textBaseline = "middle"ctx.fillText(text, textX, textY)}ctx.restore()

五、绘制指针

      // 绘制指针const angle = startAngle + (totalAngle * this.progress)let endX = (scaleRadius - 30) * Math.cos(angle)let endY = (scaleRadius - 30) * Math.sin(angle)ctx.save()ctx.translate(centerX, centerY)  // 将原点移到圆心处ctx.beginPath()ctx.moveTo(0, 0)ctx.lineTo(endX,endY)ctx.lineWidth = 3ctx.strokeStyle = '#F8E71C'ctx.stroke()ctx.restore()

六、绘制中心点

      // 绘制中心点ctx.save()ctx.beginPath()ctx.arc(centerX, centerY, 4, 0, 2*Math.PI)ctx.fillStyle = "#666666"ctx.fill()ctx.restore()

如有疑问,欢迎留言交流;

如有定制需求,欢迎私信沟通~

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

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

相关文章

Spring Boot 中实现自定义注解记录接口日志功能

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

【超详细实操内容】django的身份验证系统之限制用户访问的三种方式

目录 1、使用request.user.is_authenticated属性 2、装饰器login_required 3、LoginRequiredMixin类 通常情况下,网站都会对用户限制访问,例如,未登录的用户不可访问用户中心页面。Django框架中使用request.user.isauthenticated属性、装饰器loginrequired和LoginRequire…

scss配置全局变量报错[sass] Can‘t find stylesheet to import.

路径没有错误&#xff0c;使用别名即可 后又提示Deprecation Warning: Sass import rules are deprecated and will be removed in Dart Sass 3.0.0. 将import改为use 使用时在$前添加全局变量所在文件&#xff0c;即variable.

基于Qlearning强化学习的机器人路线规划matlab仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 训练过程 测试结果 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论…

9 RCC使用HSE、HSI配置时钟

一、时钟树 RCC&#xff1a;reset clock control,复位和时钟控制器。HSE是外部的高速时钟信号&#xff0c;可以由有源晶振或者无源晶振提供。如果使用HSE或者HSE经过PLL倍频之后的时钟作为系统时钟SYSCLK&#xff0c;当HSE故障时候&#xff0c;不仅HSE会被关闭&#xff0c;PLL…

认识数据结构之——排序

一、 插入排序&#xff1a; 直接插入排序(以排升序为例)&#xff1a; 排序思想&#xff1a; 单趟&#xff1a;记录某个位置的值&#xff0c;一个一个和前面的值比较&#xff0c;碰到更大的就往后覆盖&#xff0c;碰到更小的或者相等的就结束&#xff0c;最后将记录的值插入到…

uniapp 微信小程序 功能入口

单行单独展示 效果图 html <view class"shopchoose flex jsb ac" click"routerTo(要跳转的页面)"><view class"flex ac"><image src"/static/dyd.png" mode"aspectFit" class"shopchooseimg"&g…

苍穹外卖-day05redis 缓存的学习

苍穹外卖-day05 课程内容 Redis入门Redis数据类型Redis常用命令在Java中操作Redis店铺营业状态设置 学习目标 了解Redis的作用和安装过程 掌握Redis常用的数据类型 掌握Redis常用命令的使用 能够使用Spring Data Redis相关API操作Redis 能够开发店铺营业状态功能代码 功能实…

Linux之系统管理

一、相关命令 筛选 grep&#xff0c;可以用来进行筛选&#xff0c;例如对目录筛选课写成 # 过滤出带serv的 ls /usr/sbin | grep serv2. 对服务的操作 2.1 centos6版本 service 服务名 start|stop|restart|status # start&#xff1a;开启 # stop&#xff1a;停止 # restart…

什么?Flutter 可能会被 SwiftUI/ArkUI 化?全新的 Flutter Roadmap

在刚刚过去的 FlutterInProduction 活动里&#xff0c;Flutter 官方除了介绍「历史进程」和「用户案例」之外&#xff0c;也着重提及了未来相关的 roadmap &#xff0c;其中就有 3.27 里的 Swift Package Manager 、 Widget 实时预览 和 Dart 与 native 平台原生语言直接互操作…

Unity录屏插件-使用Recorder录制视频

目录 1.Recorder的下载 2.Recorder面板 2.1常规录制属性 2.2录制器配置 2.2.1添加录制器 2.2.2配置Input属性 2.2.3配置 Output Format 属性 2.2.4配置 Output File 属性 3.Recorder的使用 3.1录制Game View视频 3.1.1Recorder配置与场景搭建 3.1.2开始录制 3.1.3…

Android Vendor Overlay机制

背景介绍&#xff1a; 看Android 15版本更新时&#xff0c;"Android 15 deprecates vendor overlay"。 猜想这个vendor overlay是之前用过的settings overlay&#xff0c; 不过具体是怎么回事呢&#xff1f; 目录 Vendor Overlay介绍 Vendor Overlay工作原理 Ven…

Python 绘图魔法:用turtle库开启你的编程艺术之旅

&#x1f3e0;大家好&#xff0c;我是Yui_&#xff0c;目标成为全栈工程师~&#x1f4ac; &#x1f351;如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f680;如有不懂&#xff0c;可以随时向我提问&#…

AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python

支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用&#xff0c;今天我们用它来进行一次文本情感分析训练。 一、概念温习 支持向量机&#xff08;SVM&#xff09;是一种监督学习算法&#xff0c;广泛用于分类和回归问题。 它的核心思想是通过…

.net core在linux导出excel,System.Drawing.Common is not supported on this platform

使用框架 .NET7 导出组件 Aspose.Cells for .NET 5.3.1 asp.net core mvc 如果使用Aspose.Cells导出excel时&#xff0c;报错 &#xff1a; System.Drawing.Common is not supported on this platform 平台特定实现&#xff1a; 对于Windows平台&#xff0c;System.Drawing.C…

【Unity3D】实现可视化链式结构数据(节点数据)

关键词&#xff1a;UnityEditor、可视化节点编辑、Unity编辑器自定义窗口工具 使用Newtonsoft.Json、UnityEditor相关接口实现 主要代码&#xff1a; Handles.DrawBezier(起点&#xff0c;终点&#xff0c;起点切线向量&#xff0c;终点切线向量&#xff0c;颜色&#xff0c;n…

6UCPCI板卡设计方案:8-基于双TMS320C6678 + XC7K420T的6U CPCI Express高速数据处理平台

基于双TMS320C6678 XC7K420T的6U CPCI Express高速数据处理平台 1、板卡概述 板卡由我公司自主研发&#xff0c;基于6UCPCI架构&#xff0c;处理板包含双片TI DSP TMS320C6678芯片&#xff1b;一片Xilinx公司FPGA XC7K420T-1FFG1156 芯片&#xff1b;六个千兆网口&#xff…

Python + 深度学习从 0 到 1(01 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ 深度学习之前&#xff1a;机器学习简史 什么要了解…

丹摩|丹摩助力selenium实现大麦网抢票

丹摩&#xff5c;丹摩助力selenium实现大麦网抢票 声明&#xff1a;非广告&#xff0c;为用户体验 1.引言 在人工智能飞速发展的今天&#xff0c;丹摩智算平台&#xff08;DAMODEL&#xff09;以其卓越的AI算力服务脱颖而出&#xff0c;为开发者提供了一个简化AI开发流程的强…

企业内训|高智能数据构建、Agent研发及AI测评技术内训-吉林省某汽车厂商

吉林省某汽车厂商为提升员工在AI大模型技术方面的知识和实践能力&#xff0c;举办本次为期8天的综合培训课程。本课程分为两大部分&#xff1a;面向全体团队成员的AI大模型技术结构与行业应用&#xff0c;以及针对技术团队的高智能数据构建与Agent研发。课程内容涵盖非结构化数…