关于canvas:利用canvas绘制时钟模拟时钟效果

40次阅读

共计 2974 个字符,预计需要花费 8 分钟才能阅读完成。

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <script>
        window.onload = function () {var canvas = document.querySelector('canvas')
            var context = canvas.getContext('2d')
            
            function clock() {
                // 绘制圆盘
                context.beginPath()
                context.arc(300, 300, 200, 0, Math.PI * 2)
               
                context.fillStyle = 'yellow'
                context.fill()
                // 完结门路
                context.closePath()

                // 绘制时刻度
                for (i = 1; i <= 12; i++) {// save(): 将以后的绘画状态进行保留并存入状态栈
                    // 简而言之就是保留画刻度之前的状态 和 restore() 一起用
                    context.save()
                    context.lineWidth = 4
                    context.beginPath()
                    // 将原点平移 圆心地位
                    context.translate(300, 300)
                    // 旋转 30 度  小时的刻度
                    // angle: 旋转角度,旋转的中心点就是坐标轴的原点
                    context.rotate(i * (Math.PI / 6))
                    // 绘制时刻度  从内向里画(反过来则要正数)context.moveTo(0, 200)
                    context.lineTo(0, 180)
                    context.stroke()
                    context.fillStyle = 'black'
                    // 调整数字的大小
                    context.font = '20px bold'
                    // 数半径
                    context.fillText(i, -10, -150)
                    context.closePath()
                    // restore(): 该办法每次调用只会回滚到上一次 save 的状态
                    // 回退到画刻度之前的 save() 状态,不影响前面的时针,分针等等的绘制
                    context.restore()}

                // 绘制分刻度  分针要转 60 次
                for (i = 1; i <= 60; i++) {context.save()
                    // 平移原点    新的原点就是圆心
                    context.translate(300, 300)
                    // 分针要转 60 次的 6 度     Math.PI 相当于 180 度
                    context.rotate(i * (Math.PI / 30))
                    context.beginPath()
                    // 绘制分刻度  从里往外画
                    context.moveTo(0, -190)
                    context.lineTo(0, -200)
                    context.stroke()
                    context.closePath()
                    // 反复分刻度
                    context.restore()}

                // 利用内置函数 Date() 获取以后工夫
                var date = new Date()
                // 打印看一下
                console.log(date);
                // 获取以后的小时
                var hours = date.getHours()
                // 获取以后分钟
                var minutes = date.getMinutes()
                // 获取以后秒数
                var seconds = date.getSeconds()
                // 打印看一下
                console.log(hours, minutes, seconds);


                // 以后的小时数
                hours = hours + minutes / 60;

                // 绘制时针  仍旧要保留绘画时针前的状态而后画完后回退
                context.save()
                // 平移原点
                context.translate(300, 300)
                // 小时乘以 30 度
                // rotate(angle): 旋转角度,旋转的中心点就是坐标轴的原点
                context.rotate(hours * (Math.PI / 6))
                context.beginPath()
                context.lineWidth = 5
                context.moveTo(0, 10)
                context.lineTo(0, -90)
                context.stroke()
                context.closePath()
                context.restore()



                // 绘制分针
                context.save()
                // 平移原点   新原点就是圆心
                context.translate(300, 300)
                // 先依据以后分钟旋转到那个地位  找到坐标 
                context.rotate(minutes * (Math.PI / 30))
                // 再绘制分针
                context.beginPath()
                // 调整时针线宽
                context.lineWidth = 3
                // 开始绘制  moveTo() 是挪动到分针的起始地位
                context.moveTo(0, 10)
                //lineTo() 是画直线  (0, -120) 是完结坐标点 这个坐标点是绝对圆心来说的,因为后面 translate(300, 300) 曾经把原点平移到圆心的地位了
                context.lineTo(0, -120)
                context.strokeStyle = 'blue'
                context.stroke()
                context.closePath()
                context.restore()


                // 绘制秒针
                context.save()
                context.translate(300, 300)
                // 小时乘以 30 度
                // angle: 旋转角度,旋转的中心点就是坐标轴的原点
                context.rotate(seconds * (Math.PI / 30))
                context.beginPath()
                // 调整线宽 也就是秒针的宽度
                context.lineWidth = 2
                // 绘制秒针
                context.moveTo(0, 10)
                context.lineTo(0, -170)
                // 扭转秒针款式
                context.strokeStyle = 'red'
                // 画的是轮廓图形
                context.stroke()
                // 完结门路
                context.closePath()
                // 回退状态
                context.restore()



                // 绘制交叉处
                //  save(): 将以后的绘画状态进行保留并存入状态栈
                context.save()
                context.translate(300, 300)
                // 开始门路
                context.beginPath()
                // 绘制时钟两头的小圆  xy 轴开始地位  小圆半径 开始弧度  完结弧度 360 度
                context.arc(0, 0, 5, 0, Math.PI * 2)
                // 填充圆设置为红色
                context.fillStyle = 'white'
                // 轮廓圆设置红色
                context.strokeStyle = 'red'
                // 绘制填充圆
                context.fill()
                // 绘制轮廓圆
                context.stroke()
                // 完结门路
                context.closePath()
                context.restore()

                // 超时模仿间歇  防止载入时 时钟先隐没一小会儿再呈现
                setTimeout(clock, 1000)
            }

            clock()}


    </script>
</head>

<body>
    <canvas width="600px" height="600px" style="background-color: rgb(154, 233, 243);"></canvas>
</body>

</html>

正文完
 0