【Canvas与艺术】淡蓝辉光汽车速度仪表盘

【关键点】

内圈处渐变色的采用。

【效果图】

【代码】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head>
     <title>淡蓝辉光汽车速度仪表盘</title>
     <style type="text/css">
     .centerlize{
        margin:0 auto;
        width:1200px;
     }
     </style>
     </head>

     <body οnlοad="init();">
        <div class="centerlize">
            <canvas id="myCanvas" width="10px" height="10px" style="border:1px dotted black;">
                如果看到这段文字说您的浏览器尚不支持HTML5 Canvas,请更换浏览器再试.
            </canvas>
        </div>
     </body>
</html>
<script type="text/javascript">
<!--
/*****************************************************************
* 将全体代码(ctrl+A)拷贝下来,粘贴到文本编辑器中,
* 另存为.html文件,再用chrome浏览器打开,就能看到实现效果。
******************************************************************/

// canvas的绘图环境
var ctx;

// 边长
const LENGTH=512;

// 舞台对象
var stage;

//-------------------------------
// 初始化
//-------------------------------
function init(){
    // 获得canvas对象
    var canvas=document.getElementById('myCanvas');  
    canvas.width=LENGTH;
    canvas.height=LENGTH;

    // 初始化canvas的绘图环境
    ctx=canvas.getContext('2d');  
    ctx.translate(LENGTH/2,LENGTH/2);// 原点平移到画布中央

    // 准备
    stage=new Stage();    
    stage.init();

    // 开幕
    animate();
}

// 播放动画
function animate(){    
    stage.update();    
    stage.paintBg(ctx);
    stage.paintFg(ctx);     

    // 循环
    if(true){
        window.requestAnimationFrame(animate);   
    }
}

// 舞台类
function Stage(){

    // 初始化
    this.init=function(){

    }

    // 更新
    this.update=function(){

    }

    // 画背景
    this.paintBg=function(ctx){
        ctx.clearRect(-LENGTH/2,-LENGTH/2,LENGTH,LENGTH);// 清屏

        // 最外层暗蓝圈
        ctx.beginPath();
        ctx.arc(0,0,250,0,Math.PI*2,false);
        ctx.closePath();
        ctx.lineWidth=2;
        ctx.strokeStyle="rgb(1,48,83)";
        ctx.stroke();

        // 第二层暗黑圈
        ctx.beginPath();
        ctx.arc(0,0,248,0,Math.PI*2,false);
        ctx.closePath();
        ctx.lineWidth=2;
        ctx.strokeStyle="rgb(1,14,25)";
        ctx.stroke();

        // 第三层暗蓝圈
        ctx.beginPath();
        ctx.arc(0,0,248,0,Math.PI*2,false);
        ctx.closePath();
        ctx.fillStyle="rgb(2,30,65)";
        ctx.fill();

        // 第四层亮蓝圈
        ctx.beginPath();
        ctx.arc(0,0,246,0,Math.PI*2,false);
        ctx.closePath();
        ctx.lineWidth=2;
        ctx.strokeStyle="rgb(6,94,149)";
        ctx.stroke();

        // 渐变色圈
        var rgnt=ctx.createRadialGradient(0,0,160,0,0,240);         
        rgnt.addColorStop(0,"rgb(9,114,161)");
        rgnt.addColorStop(0.2,"rgba(2,32,67,0.5)");
        ctx.fillStyle=rgnt;
        ctx.beginPath();
        ctx.arc(0,0,240,0,2*Math.PI,true);
        ctx.closePath();
        ctx.fill();

        // 细绿圈
        ctx.beginPath();
        ctx.arc(0,0,160,0,Math.PI*2,false);
        ctx.closePath();
        ctx.lineWidth=2;
        ctx.strokeStyle="rgb(4,150,141)";
        ctx.stroke();

        // 暗蓝底
        ctx.beginPath();
        ctx.arc(0,0,158,0,Math.PI*2,false);
        ctx.closePath();
        ctx.fillStyle="rgb(1,14,44)";
        ctx.fill();

        // 粗绿圈
        ctx.beginPath();
        ctx.arc(0,0,150,0,Math.PI*2,false);
        ctx.closePath();
        ctx.lineWidth=6;
        ctx.strokeStyle="rgb(4,150,141)";
        ctx.stroke();

        // 暗蓝断续三圈
        ctx.beginPath();
        ctx.arc(0,0,120,0,Math.PI*2,false);
        ctx.closePath();
        ctx.lineWidth=2;
        ctx.strokeStyle="rgb(87,105,204)";
        ctx.stroke();

        for(var i=0;i<3;i++){
            var alpha=Math.PI/6+i*Math.PI*2/3;

            const r=120;
            var x=r*Math.cos(alpha);
            var y=r*Math.sin(alpha);

            ctx.save();

            ctx.translate(x,y);
            ctx.rotate(alpha);            
            ctx.beginPath();
            ctx.fillStyle="rgb(1,14,44)";
            ctx.fillRect(-4,-10,8,20);
            ctx.closePath();

            ctx.beginPath();
            ctx.moveTo(-12,0);
            ctx.lineTo(6,6);
            ctx.lineTo(6,-6);
            ctx.closePath();
            ctx.fillStyle="white";
            ctx.fill();

            ctx.restore();
        }

        // 写速度
        ctx.fillStyle="white";
        ctx.font="90px Bahnschrift SemiBold Condensed";
        ctx.textAlign="center";
        ctx.textBaseLine="Middle";
        ctx.fillText("70",0,30);

        // 写速度单位
        ctx.fillStyle="white";
        ctx.font="30px Bahnschrift Condensed";
        ctx.textAlign="center";
        ctx.textBaseLine="Middle";
        ctx.fillText("km/h",0,80);
    }

    // 画前景
    this.paintFg=function(ctx){    
        var angle=Math.PI*3/2+Math.random()*Math.PI/100+Math.PI/8;

        // 画刻度
        for(var i=0;i<=120;i++){
            var theta=Math.PI/80*i+Math.PI*3/4;
            const r=244;
            var x=r*Math.cos(theta);
            var y=r*Math.sin(theta);

            // 刻度
            ctx.save();
            ctx.translate(x,y);
            ctx.rotate(theta);
            ctx.beginPath();
            ctx.moveTo(0,0-3);
            ctx.lineTo(0-6,0-3);
            ctx.lineTo(0-6,0+3);
            ctx.lineTo(0,0+3);
            ctx.closePath();
            if(theta<angle){
                ctx.fillStyle="rgb(254,98,54)";
                ctx.fill();
            }else{
                ctx.fillStyle="rgb(187,234,250)";
                ctx.fill();
            }
            ctx.restore();

            // 文字
            if(i%20==0){
                var x3=210*Math.cos(theta);
                var y3=210*Math.sin(theta);
                ctx.fillStyle="white";
                ctx.font="30px Microsoft YaHei UI";
                ctx.textAlign="center";
                ctx.textBaseLine="Middle";
                ctx.fillText(i/10,x3,y3+8);
            }
        }

        // 画指针
        var x1=236*Math.cos(angle);
        var y1=236*Math.sin(angle);
        ctx.save();        
        ctx.translate(x1,y1);
        ctx.rotate(angle);
        // 指针上片
        ctx.beginPath();
        ctx.moveTo(0,0);
        ctx.lineTo(-18,4);
        ctx.lineTo(-83,4);
        ctx.lineTo(-83,0);        
        ctx.closePath();        
        ctx.fillStyle="red";
        ctx.fill();
        // 指针下片
        ctx.beginPath();
        ctx.moveTo(0,0);
        ctx.lineTo(-18,-4);
        ctx.lineTo(-83,-4);
        ctx.lineTo(-83,0);        
        ctx.closePath();        
        ctx.fillStyle="rgb(245,0,14)";
        ctx.fill();

        ctx.restore();
    }
}

/*-------------------------------------
《面试暗语》

工资6-10K--就是6K,可能再稍往上加加,但别想多了
抗压能力强--压力很大,准备爬屎山,各种坑要填,各种锅要背
要踏实肯干--工作很累,任务很杂,从编码测试美工到墩地打扫厕所都有,要少点心思,老老实实干活。
回家等通知--大概率没戏了
两周通知你--你非首选
有消息我第一时间通知你,领导在出差还没答复-去面别家吧
我们这边没有那么快,你可以先去看其它机会--别等了,直接去别家
什么时候来上班--大概率稳了,但也有放鸽子的。
-------------------------------------*/
//-->
</script>

【原型】

END

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

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

相关文章

Windows11 安装VitrulBox Ubuntu20 虚拟机启动后卡在“Freeing initrd memory: 131304K”

步骤&#xff1a;点击启动Ubuntu后&#xff0c;一直起不来&#xff1f;没办法正常关机&#xff0c;选择重启又一直卡在这里&#xff0c;原来是同样的错误 Freeing initrd memory: 131304K 原因&#xff1a;本机联想小新14Pro&#xff0c;AMD 7840HS&#xff0c;锐龙版。而Ryze…

基于TensorFlow的花卉识别(算能杯)%%%

Anaconda Prompt 激活 TensorFlow CPU版本 conda activate tensorflow_cpu //配合PyCharm环境 直接使用TensorFlow1.数据分析 此次设计的主题为花卉识别&#xff0c;数据为TensorFlow的官方数据集flower_photos&#xff0c;包括5种花卉&#xff08;雏菊、蒲公英、玫瑰、向日葵…

设计模式之单例模式精讲

UML图&#xff1a; 静态私有变量&#xff08;即常量&#xff09;保存单例对象&#xff0c;防止使用过程中重新赋值&#xff0c;破坏单例。私有化构造方法&#xff0c;防止外部创建新的对象&#xff0c;破坏单例。静态公共getInstance方法&#xff0c;作为唯一获取单例对象的入口…

后端常问面经之Redis

Redis基础 常见的读写策略有哪些&#xff08;保证缓存和数据库数据的一致性&#xff09; Cache Aside Pattern&#xff08;旁路缓存模式&#xff09; Cache Aside Pattern 是我们平时使用比较多的一个缓存读写模式&#xff0c;比较适合读请求比较多的场景。 Cache Aside Pat…

Linux内核err.h文件分析

在阅读和编写内核相关的代码时&#xff0c;经常会看到IS_ERR、ERR_PTR等函数。这些函数在内核头文件的err.h中。以我服务器的代码为例&#xff0c;内核版本为5.15。 这个文件的代码如下&#xff1a; /* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_ERR_H #define _L…

Ubuntu deb文件 安装 MySQL

更新系统软件依赖 sudo apt update && sudo apt upgrade下载安装包 输入命令查看Ubuntu系统版本 lsb_release -a2. 网站下载对应版本的安装包 下载地址. 解压安装 mkdir /home/mysqlcd /home/mysqltar -xvf mysql-server_8.0.36-1ubuntu20.04_amd64.deb-bundle.tar# …

阿里 Modelscope 创空间部署在本地环境操作文档

创建创空间的步骤直接跳过。 备注:我的电脑是Windows 第一步&#xff1a;获取创空间代码&#xff0c;直接下载代码太慢了&#xff0c;建议通过git获取代码 第二步:复制链接,打开cmd 直接粘贴回车下载。下载完之后的到了我的Service-Assistant文件夹。再git clone https://gith…

Publish Over SSH实现Jenkins构建项目发布

1. 在Jenkins上安装Publish Over SSH插件 在“系统设置–插件管理–可选插件”界面搜索&#xff1a;SSH&#xff0c;然后选择 Publish Over SSH&#xff0c;点击安装&#xff0c;然后重启。 这里是已经安装过&#xff0c;所以在“已安装”界面里&#xff01; 2. 配置 Publis…

Linux系统下安装部署Linux管理面板1panel

目录 一 1panel介绍 1、1Panel简介 2、1Panel特点 二、本地环境规划 1、本此实验目的 2、本地环境部署 三、部署1Panel&#xff08;在线安装&#xff09; 1.创建安装目录 2.一键部署1Panel 3.检查1Panel服务运行状态 4.检查1Panel监听端口 四、关闭防火墙和selinux…

线程的状态:操作系统层面和JVM层面

在操作系统层面&#xff0c;线程有五种状态 初始状态&#xff1a;线程被创建&#xff0c;操作系统为其分配资源。 可运行状态(就绪状态)&#xff1a;线程被创建完成&#xff0c;进入就绪队列&#xff0c;参与CPU执行权的争夺。或因为一些原因&#xff0c;从阻塞状态唤醒的线程…

2024年购买阿里云服务器多少钱?1000元年预算配置报价

2024年阿里云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

区块链创新:探索 Web3 的去中心化应用

引言 随着数字化时代的发展&#xff0c;区块链技术作为一种颠覆性的技术正在改变着我们的社会和经济生活。在这个背景下&#xff0c;Web3的概念应运而生&#xff0c;它代表了一种去中心化的互联网新时代&#xff0c;为去中心化应用&#xff08;DApps&#xff09;的发展提供了坚…

面试笔记——MyBatis(执行流程、延迟加载和缓存)

MyBatis 是一个持久层框架&#xff0c;用于简化 Java 应用程序与数据库之间的交互过程。具体而言&#xff0c;它提供了一种将数据库操作映射到 Java 方法的方式&#xff0c;通过 XML 文件或注解配置 SQL 语句与 Java 方法的映射关系。使用 MyBatis&#xff0c;开发人员可以通过…

Visual Studio QT6 工程引入组件模块,例如:QtXml

QT 工程引入 QtXml QT 版本 6.6.1 Visual Studio 版本 Microsoft Visual Studio Community 2022 (64 位) - Current 版本 17.7.5 打开 Visual Studio 项目工程选择 工具栏 - 扩展 - QT VS Tools -Qt Project Settings 勾选 xml 后点击确定 点击应用即可 注意&#xff1a;配置环…

数字三角形

分析&#xff1a; 由上图可以知道&#xff0c;最大和的路径是7->3->8->7->5 (30)。 题意是一个有N层的三角形&#xff0c;来寻找从顶部到底部&#xff0c;每个数字加起来的最大和。向下移动的过程中&#xff0c;只能向左或右。 我们是找最大的和的&#xff0c;那么…

Mac电脑虚拟显示器:BetterDisplay Pro for Mac v2.0.11激活版

BetterDisplay Pro是一款由waydabber开发的Mac平台上的显示器校准软件&#xff0c;可以帮助用户调整显示器的颜色和亮度&#xff0c;以获得更加真实、清晰和舒适的视觉体验。 软件下载&#xff1a;BetterDisplay Pro for Mac v2.0.11激活版 以下是BetterDisplay Pro的主要特点&…

Java数据结构-ArrayList

目录 1. 初识集合框架2. ArrayList的介绍3. ArrayList的使用3.1 构造方法3.2 add3.3 addAll3.4 remove3.5 get3.6 set3.7 contains3.8 IndexOf3.9 lastIndexOf3.10 subList 4. ArrayList的遍历4.1 简单粗暴法4.2 循环遍历法4.3 迭代器 1. 初识集合框架 Java集合框架是Java编程…

【前端面试3+1】01闭包、跨域

一、对闭包的理解 定义&#xff1a; 闭包是指在一个函数内部定义的函数&#xff0c;并且该内部函数可以访问外部函数的变量。闭包使得函数内部的变量在函数执行完后仍然可以被访问和操作。 特点&#xff1a; 闭包可以访问外部函数的变量&#xff0c;即使外部函数已经执行完毕。…

抖音视频关键词无水印下载软件|手机网页视频批量提取工具

全新视频关键词无水印下载软件&#xff0c;助您快速获取所需视频&#xff01; 随着时代的发展&#xff0c;视频内容已成为人们获取信息和娱乐的重要途径。为了方便用户获取所需视频&#xff0c;推出了一款功能强大的视频关键词无水印下载软件。该软件主要功能包括关键词批量提取…

【经验分享||快速解决】VScode+Python配置Selenium环境配置问题。ERROR: Cannot uninstall ‘certifi‘.

目录 正常安装遇到的问题 当在控制台输入pip install selenium时候&#xff0c;遇到的问题如下&#xff1a; 主要爆红的问题为 解决办法和正确安装方法 降低selenium的版本即可 在vscode控制台输入上面的代码即可。 总结 正常安装遇到的问题 当在控制台输入pip instal…