canvas常用方法,canvas绘制时钟案例

news2024/9/21 11:13:15

时钟案例实现

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
    body {
      padding: 0;
      margin: 0;
      background-color: rgba(0, 0, 0, 0.1)
    }

    canvas {
      display: block;
      margin: 200px auto;
    }
  </style>
</head>

<body>
  <canvas id="solar" width="300" height="300"></canvas>
  <script>
    init();

    function init() {
      let canvas = document.querySelector("#solar");
      let ctx = canvas.getContext("2d");
     
      // 方式一
      setInterval(()=> draw(ctx), 1000);
      
      // 方式二 
      // requestAnimationFrame(function a(){
      //   drawDial(ctx); //绘制表盘
      //   drawAllHands(ctx); //绘制时分秒针
      //   requestAnimationFrame(a)
      // })
    }

    function draw(ctx) {
        drawDial(ctx); //绘制表盘
        drawAllHands(ctx); //绘制时分秒针
        drawCricle(ctx)
    }

    /*绘制时分秒针*/
    function drawAllHands(ctx) {
      let time = new Date();

      let s = time.getSeconds();
      let m = time.getMinutes();
      let h = time.getHours();

      let pi = Math.PI;
      let secondAngle = pi / 180 * 6 * s;  //计算出来s针的弧度
      let minuteAngle = pi / 180 * 6 * m + secondAngle / 60;  //计算出来分针的弧度
      let hourAngle = pi / 180 * 30 * h + minuteAngle / 12;  //计算出来时针的弧度

      drawHand(hourAngle, 60, 6, "blue", ctx);  //绘制时针
      drawHand(minuteAngle, 100, 4, "green", ctx);  //绘制分针
      drawHand(secondAngle, 110, 2, "red", ctx);  //绘制秒针
    }
    
    /**
     * angle: 旋转角度
     * len: 指针长度
     * width: 宽度
     * color: 填充颜色
     * ctx: canvas对象
     * */
    function drawHand(angle, len, width, color, ctx) {
      ctx.save();
      ctx.translate(150, 150); //把坐标轴的远点平移到原来的中心
      ctx.rotate(-Math.PI / 2 + angle);  //旋转坐标轴。 x轴就是针的角度
      ctx.beginPath();
      ctx.moveTo(-4, 0);
      ctx.lineTo(len, 0);  // 沿着x轴绘制针
      ctx.lineWidth = width;
      ctx.strokeStyle = color;
      ctx.lineCap = "round";
      ctx.stroke();
      ctx.closePath();
      ctx.restore();
    }

    /*绘制表盘*/
    function drawDial(ctx) {
      let pi = Math.PI;

      ctx.clearRect(0, 0, 300, 300); //清除所有内容
      ctx.save();

      ctx.translate(150, 150); //一定坐标原点到原来的中心
      ctx.beginPath();
      ctx.arc(0, 0, 148, 0, 2 * pi); //绘制圆周
      ctx.stroke();
      ctx.closePath();

      for (let i = 0; i < 60; i++) {//绘制刻度。
        const len = i % 5 ? 120 : 110;
        const start = i % 5 ? 120 : 110;
        ctx.save();
        ctx.rotate(-pi / 2 + i * pi / 30);  //旋转坐标轴。坐标轴x的正方形从 向上开始算起
        ctx.beginPath();
        ctx.moveTo(start, 0);
        ctx.lineTo(140, 0);
        ctx.lineWidth = i % 5 ? 2 : 4;
        ctx.strokeStyle = 'black';
        ctx.stroke();
        ctx.closePath();
        ctx.restore();
      }

      for (let i = 0; i <= 12; i++) {
        ctx.save();
        if (i % 3 === 0 && i!==0) {
          ctx.fillText(i, Math.cos(-pi / 2 + i * pi / 6) * 100, Math.sin(-pi / 2 +i * pi / 6) * 100)
        }
        ctx.restore();
      }
      ctx.restore();
    }

    function drawCricle(ctx){
      ctx.save();
      // // 绘制中心圆点
      ctx.translate(150, 150); //一定坐标原点到原来的中心
      ctx.beginPath();
      ctx.arc(0, 0, 8, 0, 2 * Math.PI); //绘制圆周
      ctx.fillStyle="black"
      ctx.fill();
      ctx.closePath()
      ctx.restore();
    }
  </script>
</body>

</html>

在这里插入图片描述

canvas基本使用

Canvas是HTML5提供的强大绘图工具,允许通过JavaScript在网页上绘制各种图形、图像和动画。Canvas元素提供了二维和三维绘图上下文,其中二维上下文(2D)常见于Web开发。Canvas操作基于像素,允许对每个像素进行自定义渲染。基本使用包括获取Canvas上下文、设置绘图样式(颜色、线宽等)、绘制形状(矩形、圆形、线段)、创建路径(多边形、曲线)、绘制文本等。Canvas还支持图像绘制、阴影、渐变等高级功能。

1. 基本使用

Canvas 是一个 HTML 元素,可以通过 HTML 标记添加到页面中:

<canvas id="myCanvas" width="400" height="200"></canvas>

通过 JavaScript 获取 Canvas 的上下文,然后使用上下文进行绘制:

const canvas = document.getElementById('myCanvas');
const context = canvas.getContext('2d');

2. 绘制形状

Canvas 提供了绘制各种形状的方法,包括矩形、圆形和线段。

绘制矩形:

​ canvas只支持一种原生的图形绘制:矩形。所有其他图形都至少需要生成一种路径 (path)。
canvas 提供了三种方法绘制矩形:
1、fillRect(x, y, width, height):绘制一个填充的矩形。
2、strokeRect(x, y, width, height):绘制一个矩形的边框。
3、clearRect(x, y, widh, height):清除指定的矩形区域,然后这块区域会变的完全透明。
参数说明:
x, y:指的是矩形的左上角的坐标。(相对于canvas的坐标原点)
width, height:指的是绘制的矩形的宽和高。

context.fillStyle = 'blue'; // 填充颜色
context.fillRect(50, 50, 100, 100); // 绘制矩形

在这里插入图片描述

绘制圆弧、圆形:

有两个方法可以绘制圆弧:

1、arc(x, y, r, startAngle, endAngle, anticlockwise): 以(x, y) 为圆心,以r 为半径,从 startAngle 弧度开始到endAngle弧度结束。anticlosewise 是布尔值,true 表示逆时针,false 表示顺时针(默认是顺时针)。

radians=(Math.PI/180)*degrees //角度转换成弧度
2、arcTo(x1, y1, x2, y2, radius): 根据给定的控制点和半径画一段圆弧,最后再以直线连接两个控制点。

// 圆形
context.fillStyle = 'red';
context.beginPath();
context.arc(100, 100, 50, 0, Math.PI * 2, true); // 绘制圆形
context.fill();

// 圆弧
ctx.beginPath();
ctx.arc(50, 50, 40, 0, Math.PI / 2, false);
ctx.stroke();

在这里插入图片描述
在这里插入图片描述

3. 绘制路径

路径是通过不同颜色和宽度的线段或曲线相连形成的不同形状的点的集合。一个路径,甚至一个子路径,都是闭合的。
使用路径绘制图形需要一些额外的步骤:

  • 创建路径起始点
  • 调用绘制方法去绘制出路径
  • 把路径封闭
  • 一旦路径生成,通过描边或填充路径区域来渲染图形。
  1. 创建路径对象:在Canvas上下文中,首先要创建一个路径对象,通常通过beginPath()方法来开始一个新的路径。这将清空任何之前的路径。
context.beginPath();
  1. 定义路径:在路径对象上,使用不同的绘图命令来定义路径的形状。一些常见的绘图命令包括:

    • moveTo(x, y): 移动到指定的坐标点,不绘制线条。
    • lineTo(x, y): 从当前点到指定点绘制一条直线。
    • arc(x, y, radius, startAngle, endAngle, anticlockwise): 以指定圆心、半径和角度绘制弧线。
    • quadraticCurveTo(cpx, cpy, x, y): 以控制点和终点绘制二次贝塞尔曲线。
    • bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y): 以两个控制点和终点绘制三次贝塞尔曲线。
  2. 关闭路径closePath()方法来连接路径的起点和终点,形成封闭的图形。

context.closePath();
  1. 渲染路径:通过stroke()方法来描边路径,或者fill()方法来填充路径。strokeStylefillStyle属性可以用于设置描边和填充的颜色。

  2. 清除路径:通常在渲染路径后,可以使用beginPath()来清除当前路径,以准备绘制新的路径。

context.beginPath();
绘制线段:
 context.beginPath();
 context.moveTo(100,100,); // 绘制圆形
 context.lineTo(200, 100)
 context.lineWidth = 2;
 context.strokeStyle="blue";
 context.stroke();

在这里插入图片描述

绘制多边形:
context.fillStyle = 'purple';
context.beginPath();
context.moveTo(50, 150); // 起点
context.lineTo(100, 50);
context.lineTo(150, 150);
context.closePath(); // 封闭路径
context.fill(); // 填充多边形

在这里插入图片描述

绘制曲线:
context.strokeStyle = 'orange';
context.lineWidth = 2;
context.beginPath();
context.moveTo(250, 150);
context.quadraticCurveTo(300, 50, 350, 150); // 二次贝塞尔曲线
context.stroke();

在这里插入图片描述

4. 绘制文本

Canvas 允许您在画布上绘制文本。

context.font = '24px Arial'; // 字体和字号
context.fillStyle = 'black'; // 文本颜色
context.fillText('Hello, Canvas!', 50, 50); // 绘制文本

在这里插入图片描述

5. 渲染样式

Canvas 允许您自定义绘图样式,包括颜色、阴影。

阴影:
 	  context.shadowColor = 'gray';
      context.shadowBlur = 5;
      context.shadowOffsetX = 10;
      context.shadowOffsetY = 10;
      context.fillStyle = 'blue'; // 填充颜色
      context.fillRect(50, 50, 100, 100); // 绘制矩形

在这里插入图片描述

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

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

相关文章

list列表前端分页功能已经提交list时容易犯错的问题回顾

最近在开发中&#xff0c;有返回list需要前端分页的&#xff0c;而且后续还需提交整个list&#xff0c;虽说前端分页并不难&#xff0c;但还有会有一些问题&#xff1a; 从图片代码就可以很清晰的看到前端分页&#xff0c;如何点击页数翻页的&#xff0c;很简单&#xff0c;但…

《低代码指南》——如何用维格表实现餐饮数字化

信息 企业采购了相关餐饮 SssS 系统,很多餐饮企业一线员工对软件认知水平不足,在内部很难普遍推广餐饮系统员工不爱用,只有老板看,老板看完以后还要往下一级一级分发任务和指标各门店及岗位、仍存在办公协同困难大,一线员工还是人工处理数据,统计数据不及时、效率低、信息…

SSL证书优惠活动

当今互联网世界充满了网络威胁&#xff0c;安全性已经成为每个网站所有者和用户的首要关注。SSL证书是一种保护网站和用户数据安全的关键工具。为了帮助您提高您的网站安全性&#xff0c;在双十一来临之前&#xff0c;我们很高兴地宣布一项近乎疯狂的SSL证书优惠活动&#xff1…

信息科技如何做好风险管理

文章目录 前言介绍亮点结构读者对象 前言 信息科技对金融业务发展所起的作用是举足轻重的。 近年来&#xff0c;金融机构在战略规划中相继引入科技引领的概念。作为金融机构信息科技从业人员&#xff0c;我们笃信信息科技是一个非常有用的工具&#xff0c;一个兼具产品思维和管…

Ubuntu安装VM TOOLS解决虚拟机无法和WINDOWS粘贴复制问题

1&#xff1a;首先使用VMware Workstation安装一个Ubuntu的系统。 2&#xff1a;现在已经不建议安装VM TOOLS。建议安装OPEN-VM-TOOLS。 3&#xff1a;进入系统使用下面的命令安装。 sudo apt install open-vm-tools 4&#xff1a;提示下面错误&#xff0c;Package open-vm…

大麦抢票订单生成 大麦订单一键生成 大麦订单截图

1、能够一键的进行添加&#xff0c;生成的假订单是没有水印的&#xff0c;界面也很真实。 2、在软件中输入生成的信息&#xff0c;这里输入的是商品信息&#xff0c;选择生成的商品图片&#xff0c;最后生成即可。 新版大麦订单生成 图样式展示 这个样式图就是在大麦生成完…

学生专用台灯怎么选?双十一专业学生护眼台灯推荐

台灯应该是很多家庭都会备上一盏的家用灯具&#xff0c;很多大人平时间看书、用电脑都会用上它&#xff0c;不过更多的可能还是给家中的小孩学习、阅读使用的。而且现在的孩子近视率如此之高&#xff0c;这让家长们不得不重视孩子的视力健康问题。那么孩子学习使用的台灯应该怎…

禧侬农韶关基金发布会

禧侬农信息科技&#xff08;深圳&#xff09;有限公司韶产业引导基金发布会圆满成功 红润控股集团旗下子公司禧侬农信息科技&#xff08;深圳&#xff09;有限公司与香港开心联众集团在政府的见证和支持下&#xff0c;达成了产业引导基金的战略合作伙伴关系。这意味着未来禧侬…

UG\NX二次开发 修改dlx对话框标题的方法

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介 UG\NX二次开发 修改dlx对话框标题的方法 效果 代码 theDialog->TopBlock()->FindBlock("Dialog")->GetProperties()->SetString("Label"…

如何为你的地图数据设置地图样式?

地图样式设置是GIS系统中非常重要的功能模块&#xff0c;水经微图Web版本最近对符号样式功能模块进行了升级。 你可以通过以下网址直接打开访问&#xff1a; https://map.wemapgis.com 现在我们为大家分享一下水经微图Web版中&#xff0c;如何为你标注的地图数据设置地图样式…

【Linux】Socket(初识网络)

目录 一、网络初识1.协议2.OSI七层模型3.TCP/IP五层模型4.通讯原理图解 二、socket1.源IP和目的IP2.端口号3.端口号和进程ID4.初识TCP、UCP协议5.网络字节序 三、socket接口1.常见API2.sockaddr结构 一、网络初识 网络在计算机中的位置。 网络也是一种软件&#xff0c;所以网…

将设计模式门面模式运用到生活当中

文章目录 &#x1f31f; 如何将设计模式门面模式运用到生活当中&#x1f34a; 家居篇&#x1f389; 门锁控制&#x1f389; 窗帘控制 &#x1f34a; 旅游篇&#x1f389; 行程规划&#x1f389; 旅游出行 &#x1f34a; 金融篇&#x1f389; 网上银行&#x1f389; 投资产品 &a…

prosemirror 学习记录(四)decoration

使用 decorations 使用 props - decorations() 添加 decorations 写一个简单的插件&#xff1a;高亮所有 apple 节点 export const MyHighlightApplesPlugin new Plugin({props: {// view 每次变化都会执行 decorations 方法decorations(state) {let arrs [];state.doc.de…

Linux常用命令——chsh命令

在线Linux命令查询工具 chsh 用来更换登录系统时使用的shell 补充说明 chsh命令用来更换登录系统时使用的shell。若不指定任何参数与用户名称&#xff0c;则chsh会以应答的方式进行设置。 语法 chsh(选项)(参数)选项 -s<shell 名称>或--shell<shell 名称>&a…

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.10 总结QT中的事件传递流程

本节对应的视频讲解&#xff1a;B_站_链_接 【QT开发笔记-基础篇】 第4章 事件 4.10 总结事件传递流程(1) 事件处理函数接受还是忽略 本章要实现的整体效果如下&#xff1a; 事件传递总流程图&#xff0c;如下&#xff1a; 这张图是不是还不太明白&#xff1f;&#xff1f; 别…

《CS2》隆重登场,艾尔莎EA H610M-I和你征战新版本

作为电竞游戏的常青树&#xff0c;《反恐精英》的热门程度可以说是经久不衰。虽然《反恐精英》已经迭代了许多个版本&#xff0c;但是上一次大版本更新已经是2012年的《CS:GO》了。最近&#xff0c;V社正式上线了全新的《CS2》&#xff0c;它是由Source2引擎所开发&#xff0c;…

Nat. Methods | 哈佛李恒组开发三代HiFi宏基因组组装软件--hifiasm-meta

使用hifiasm-meta进行Hifi长读宏基因组序列组装 Metagenome assembly of high-fidelity long reads with hifiasm-meta Article&#xff0c;2022-05-09 Nature methods, [IF 48] DOI&#xff1a;https://doi.org/10.1038/s41592-022-01478-3 原文链接&#xff1a;https://www.n…

全连接=可编程!玻色量子成功研制光量子测控一体机——“量枢”

近日&#xff0c;北京玻色量子科技有限公司成功完成了光量子测控一体机——“量枢”的研制&#xff0c;作为一款光量子信号测量反馈控制设备&#xff0c;它是专门为相干光量子计算机定制的一套集光量子测量反馈、系统状态检测、计算流程控制等功能于一身的智能系统。 玻色量子自…

腾讯联手警方重拳出击,平阳警方斩断特大外挂黑色产业链

近期&#xff0c;在闲游盒腾讯守护者计划安全团队的协助下&#xff0c;平阳警方成功破获一起特大《绝地求生》外挂案件。捣毁了一个集外挂作者、卡盟平台、一级代理销售商、二级代理销售商等多个环节为一体的网络黑色产业链&#xff0c;共抓捕34名犯罪嫌疑人。 2018年5月初&…

什么是React中的context(上下文)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…