canvas学习(二):绘制时钟

需求

绘制一个简单时钟,要求
:1、时分秒、表盘
	2、随真实时间进行变化

结果图:
在这里插入图片描述

步骤

  1. canvas基本对象
<canvas id="canvas1" width="800" height="600">
   你的浏览器不支持canvas
 </canvas>
 <script>
   // 1、找到画布对象
   /** @type {HTMLCanvasElement} */
   var canvas= document.getElementById('canvas1')
   console.log([canvas])
   // 2、上下文对象,画笔
   var ctx=canvas.getContext('2d') // 用于2d对象绘制 webgl是3d引擎
   ctx.save() // 保持最原始的坐标状态
 </script>
  1. 绘制表盘
绘制表盘
1、先移动坐标原点到画布中央(这样画圆就不需要计算坐标)
2、保存此刻的坐标池状态,方便其他绘制
2、绘制一个半径200的圆作为表盘最外层
// 绘制表盘
     // 以坐标原点为圆心 移动到画布的中央
     ctx.translate(400,300)
     ctx.save() // 保存状态
     ctx.beginPath() // 开始绘制
     ctx.arc(0,0,200,0,2*Math.PI) // 坐标x,y 半径 弧度
     ctx.strokeStyle="darkgrey" // 颜色
     ctx.lineWidth=10 // 线段宽度
     ctx.stroke()
     ctx.closePath() // 表盘绘制结束
  1. 绘制时、分刻度
顺序:分->时
原因(后面绘制的会把前面绘制的覆盖)
// 绘制秒钟刻度 先分->时 (原因:后面绘制的会把前面绘制的覆盖掉)
      // 绘制分钟刻度
      for(var j=0;j<60;j++){
        ctx.rotate(Math.PI/30) // 每次旋转坐标池6度
        ctx.beginPath()
        ctx.moveTo(190,0) // 线段的起点
        ctx.lineTo(200,0) // 线段的终点
        ctx.lineWidth=2
        ctx.strokeStyle="orangered"
        ctx.stroke()
        ctx.closePath()
      }
 	ctx.restore() // 恢复到中央坐标原点状态
    ctx.save() // 保存当前的中央坐标原点状态
    // 绘制刻度
    // 绘制12个时钟刻度
    for(var i=0;i<12;i++){
      ctx.rotate(Math.PI/6) // 每次旋转坐标池30度
      ctx.beginPath()
      ctx.moveTo(180,0)
      ctx.lineTo(200,0)
      ctx.lineWidth=10
      ctx.strokeStyle="darkgrey"
      ctx.stroke()
      ctx.closePath()
    }
  1. 绘制时针、分针、秒针
1、先把圆逆时针旋转90°,保证x轴在上面(原因:刻度为0点的时候,时针在x轴上)
2、顺序:秒针-分针-时针
3、时间计算(12小时制)
4、位置计算、时分秒针样式绘制
     // 在绘制表盘的时候添加坐标池逆时针旋转
     // 以坐标原点为圆心 移动到画布的中央
     ctx.translate(400,300)
 ++ ctx.rotate(-Math.PI/2) // 逆时针旋转90° 保证x轴是上面的 方便计算时分秒针刻度 比如:0时时针是在x轴上
     ctx.save() // 保存状态
     ctx.beginPath() // 开始绘制
     ctx.arc(0,0,200,0,2*Math.PI) // 坐标x,y 半径 弧度
     ctx.strokeStyle="darkgrey"
     ctx.lineWidth=10
     ctx.stroke()
     ctx.closePath() // 表盘绘制结束
// 时间
   	 var time = new Date()
     var hour = time.getHours()
     var min = time.getMinutes()
     var sec = time.getSeconds()
     hour=hour>12?hour-12:hour // 原因:表盘是12小时制
     console.log(hour+':'+min+':'+sec)
// 绘制秒针
     ctx.restore() // 恢复到中央坐标原点状态
     ctx.save() // 保存当前的中央坐标原点状态
     ctx.beginPath()
     // 根据秒针的时间进行旋转 1圈有60秒
     ctx.rotate(2*Math.PI/60*sec)
     ctx.moveTo(-30,0)
     ctx.lineTo(170,0)
     ctx.lineWidth=2
     ctx.strokeStyle="red"
     ctx.stroke()
     ctx.closePath()
// 绘制分针
     ctx.restore() // 恢复到中央坐标原点状态
     ctx.save() // 保存当前的中央坐标原点状态
     ctx.beginPath()
     // 根据分针的时间进行旋转 1圈有60分钟 一圈有3600秒
     ctx.rotate(2*Math.PI/60*min+2*Math.PI/3600*sec)
     ctx.moveTo(-20,0)
     ctx.lineTo(150,0)
     ctx.lineWidth=4
     ctx.strokeStyle="darkblue"
     ctx.stroke()
     ctx.closePath()
	// 绘制时针
     ctx.restore() // 恢复到中央坐标原点状态
     ctx.save() // 保存当前的中央坐标原点状态
     ctx.beginPath()
     // 根据时针的时间进行旋转 1圈有12小时 一圈有12*60分 一圈有60*60*12秒
     ctx.rotate(2*Math.PI/12*hour+2*Math.PI/60/12*min+2*Math.PI/60/60/12*sec)
     ctx.moveTo(-10,0)
     ctx.lineTo(140,0)
     ctx.lineWidth=6
     ctx.strokeStyle="darkslategray"
     ctx.stroke()
     ctx.closePath()
// 绘制圆心 表盘的中心
     ctx.restore() // 恢复到中央坐标原点状态
     ctx.save() // 保存当前的中央坐标原点状态
     ctx.beginPath()
     ctx.arc(0,0,10,0,2*Math.PI)
     ctx.fillStyle = "deepskygray"
     ctx.fill()
     ctx.closePath()
  1. 每秒定时函数
1、先回到最初坐标原点状态
ctx.restore() // 回到中央坐标原点状态
ctx.restore() // 回到最初原点位置
2、每秒执行的定时器函数
setInterval(()=>{
     renderClock()
   },1000)
3、重复清楚画布重画逻辑
ctx.clearRect(0,0,800,600) // 清除之前的画布,重新画
  1. 全部代码
 <script>
   // 1、找到画布对象
   /** @type {HTMLCanvasElement} */
   var canvas= document.getElementById('canvas1')
   console.log([canvas])
   // 2、上下文对象,画笔
   var ctx=canvas.getContext('2d') // 用于2d对象绘制 webgl是3d引擎
   // 3、绘制图像
   // 画圈圈、画刻度 每隔一秒画一次

   // 不断的更新时间
   function renderClock(){
     ctx.clearRect(0,0,800,600) // 清除之前的画布,重新画
     ctx.save() // 保持最原始的坐标状态
     // 绘制表盘
     // 以坐标原点为圆心 移动到画布的中央
     ctx.translate(400,300)
     ctx.rotate(-Math.PI/2) // 逆时针旋转90° 保证x轴是上面的 方便计算时分秒针刻度 比如:0时时针是在x轴上
     ctx.save() // 保存状态
     ctx.beginPath() // 开始绘制
     ctx.arc(0,0,200,0,2*Math.PI) // 坐标x,y 半径 弧度
     ctx.strokeStyle="darkgrey"
     ctx.lineWidth=10
     ctx.stroke()
     ctx.closePath() // 表盘绘制结束

     // 绘制秒钟刻度 先分->时 (原因:后面绘制的会把前面绘制的覆盖掉)
     // 绘制分钟刻度
     for(var j=0;j<60;j++){
       ctx.rotate(Math.PI/30) // 每次旋转坐标池6度
       ctx.beginPath()
       ctx.moveTo(190,0)
       ctx.lineTo(200,0)
       ctx.lineWidth=2
       ctx.strokeStyle="orangered"
       ctx.stroke()
       ctx.closePath()
     }

     ctx.restore() // 恢复到中央坐标原点状态
     ctx.save() // 保存当前的中央坐标原点状态
     // 绘制刻度
     // 绘制12个时钟刻度
     for(var i=0;i<12;i++){
       ctx.rotate(Math.PI/6) // 每次旋转坐标池30度
       ctx.beginPath()
       ctx.moveTo(180,0)
       ctx.lineTo(200,0)
       ctx.lineWidth=10
       ctx.strokeStyle="darkgrey"
       ctx.stroke()
       ctx.closePath()
     }
     
     // 绘制时分秒针
     var time = new Date()
     var hour = time.getHours()
     var min = time.getMinutes()
     var sec = time.getSeconds()
     hour=hour>12?hour-12:hour // 原因:表盘是12小时制
     console.log(hour+':'+min+':'+sec)
     // 绘制秒针
     ctx.restore() // 恢复到中央坐标原点状态
     ctx.save() // 保存当前的中央坐标原点状态
     ctx.beginPath()
     // 根据秒针的时间进行旋转 1圈有60秒
     ctx.rotate(2*Math.PI/60*sec)
     ctx.moveTo(-30,0)
     ctx.lineTo(170,0)
     ctx.lineWidth=2
     ctx.strokeStyle="red"
     ctx.stroke()
     ctx.closePath()

     // 绘制分针
     ctx.restore() // 恢复到中央坐标原点状态
     ctx.save() // 保存当前的中央坐标原点状态
     ctx.beginPath()
     // 根据分针的时间进行旋转 1圈有60分钟 一圈有3600秒
     ctx.rotate(2*Math.PI/60*min+2*Math.PI/3600*sec)
     ctx.moveTo(-20,0)
     ctx.lineTo(150,0)
     ctx.lineWidth=4
     ctx.strokeStyle="darkblue"
     ctx.stroke()
     ctx.closePath()

     // 绘制时针
     ctx.restore() // 恢复到中央坐标原点状态
     ctx.save() // 保存当前的中央坐标原点状态
     ctx.beginPath()
     // 根据时针的时间进行旋转 1圈有12小时 一圈有12*60分 一圈有60*60*12秒
     ctx.rotate(2*Math.PI/12*hour+2*Math.PI/60/12*min+2*Math.PI/60/60/12*sec)
     ctx.moveTo(-10,0)
     ctx.lineTo(140,0)
     ctx.lineWidth=6
     ctx.strokeStyle="darkslategray"
     ctx.stroke()
     ctx.closePath()

     // 绘制圆心 表盘的中心
     ctx.restore() // 恢复到中央坐标原点状态
     ctx.save() // 保存当前的中央坐标原点状态
     ctx.beginPath()
     ctx.arc(0,0,10,0,2*Math.PI)
     ctx.fillStyle = "deepskygray"
     ctx.fill()
     ctx.closePath()
     
     ctx.restore() // 回到中央坐标原点状态
     ctx.restore() // 回到最初原点位置
   }
   
   setInterval(()=>{
     renderClock()
   },1000)
 </script>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值