使用canvas绘制一个时钟

准备工作,设置基准

设置表钟的表心位置坐标(x,y)和表钟大小(r)。创建canvas,使用getContext() 方法返回canvas对象。

得到时分秒表针每走一步的度数,用来绘制扇形

  1. 初始化起始位置
  2. 时针因为一共12格,所以每走一步的度数为 30°
  3. 分针一共60格,所以一步为 6°
  4. 秒针6°
  5. 为了修饰,当秒针走了10秒时,分钟多一度;同理分针走了2分钟时,时针多一度。

绘制一个小刻度的扇形

在这里插入图片描述

绘制白色表盘

用白色表盘盖住上一个扇形圆,生成一个带有刻度的新扇形圆
在这里插入图片描述

绘制大刻度

在这里插入图片描述

绘制小白色表盘

在这里插入图片描述

绘制时分秒表针

在这里插入图片描述

定时启动

使用setInterval(drawWatch, 1000)设置一秒启动一次

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>时钟</title>
    <style>
        body {
            background-color: cadetblue;
        }
        #watch {
            background-color: #fff;
            display: block;
            margin: 0 auto;
        }
    </style>
</head>
<body>
    <canvas id="watch" width="600px" height="600px">  
    </canvas>
    <script>
        var canvas = document.querySelector('canvas')
        var ctxWatch = canvas.getContext('2d')
        var x = 300;
        var y = 300;
        var r = 200;

        window.onload = drawWatch
        setInterval(drawWatch, 1000)

        function drawWatch(){
            var oDate = new Date()
            var oHour = oDate.getHours()
            var oMin = oDate.getMinutes()
            var oSec = oDate.getSeconds()

            var oHourScale = (-90 + (360 / 12) * oHour + oMin / 2) * Math.PI / 180
            var oMinScale = (-90 + (360 / 12 / 5) * oMin + oSec / 10) * Math.PI / 180
            var oSecScale = (-90 + (360 / 12 / 5) * oSec) * Math.PI / 180

            // 绘制小刻度
            drawScaleDial(60, 6)

            //绘制白色表盘
            drawWhiteDial(19 / 20 * r)

            // 绘制大刻度
            drawScaleDial(12, 30)

            //绘制小白色表盘
            drawWhiteDial(18 / 20 * r)

            // 时针
            drawHands(5, 10 / 20 * r, oHourScale)
            drawHands(3, 15 / 20 * r, oMinScale)
            drawHands(1, 18 / 20 * r, oSecScale)
        }

        function drawScaleDial(lineNum, degree){
            ctxWatch.beginPath()
            for(var i = 0; i < lineNum; i++){
                // 把路径移动到画布中的指定点,不创建线条
                ctxWatch.moveTo(x, y);
                /* 
                创建弧/曲线(用于创建圆形或部分圆)
                    x	圆的中心的 x 坐标。
                    y	圆的中心的 y 坐标。
                    r	圆的半径。
                    sAngle	起始角,以弧度计(弧的圆形的三点钟位置是 0 度)。
                    eAngle	结束角,以弧度计。
                    counterclockwise	可选。规定应该逆时针还是顺时针绘图。False = 顺时针,true = 逆时针。
                */
                ctxWatch.arc(x, y, r, i * degree * Math.PI / 180, (i+1) * degree * Math.PI / 180, false);
            }
            ctxWatch.closePath()
            // 绘制已定义的路径
            ctxWatch.stroke()
        }

        function drawWhiteDial(radius){
            ctxWatch.fillStyle = 'white'
            ctxWatch.beginPath()
            ctxWatch.moveTo(x, y)
            ctxWatch.arc(x, y, radius, 0, 360 * Math.PI / 180, false);
            ctxWatch.closePath()
            // 填充当前绘图(路径)
            ctxWatch.fill()
        }

        function drawHands(lineWidth, length, showPosition){
            ctxWatch.lineWidth = lineWidth
            ctxWatch.beginPath()
            ctxWatch.moveTo(x, y)
            ctxWatch.arc(x, y, length, showPosition, showPosition, false);
            ctxWatch.closePath()
            ctxWatch.stroke()
        }
    </script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值