新手用canvas画时钟

学习canvas时,发现手机上的时钟图标显示是动态的,且跟真实时间一致,正好用来练手,最终效果图如下:

 

实现思路:

时钟分为表盘(背景矩形+圆盘+刻度)和表针(时分秒),整个实现的过程分为4步:

  • 转换坐标轴
  • 画表盘+刻度线
  • 画表针
  • 让表针动起来

相关知识点:

1、translate坐标轴位移

2、画线条、圆、矩形、圆角矩形

3、rotate旋转坐标轴画刻度

4、restore和save的使用和区别

5、定时器循环调用

完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>clock</title>
</head>
<body>
    <canvas id="canvas" width="1800" height="1800"></canvas>
    <script>
        var context = canvas.getContext('2d')
        context.translate(400, 400)
        context.lineCap = "round"; // 画出的线条端点是圆角的
        function body() {
 
            context.beginPath();
            context.roundRect(-240,-240,480,480,90);
            context.fillStyle = '#1E90FF';
            context.fill()
            context.closePath();
            context.restore();  
            context.save();
        }
        // 画表盘
        function yuan_out() {
            // 表盘外圆
            context.beginPath();
            context.arc(0, 0, 220, 0, 2 * Math.PI);
            context.fillStyle = '#FFFFFF';
            context.fill()
            context.closePath();
            context.restore();  
            context.save();
        }
        // 画表盘刻度
        function num_hour() {
            for (let i = 0; i < 60; i++) {
                context.beginPath();
                context.lineWidth = 3;
                context.strokeStyle = '#708090';
                context.rotate(30 * Math.PI / 180);
                context.moveTo(180, 0);
                context.lineTo(200, 0);
                context.stroke();
                context.closePath();
            }
            context.restore()
            context.save()
        }

        // 时针
        function dHour(hour, min) {
            context.rotate((((360 / 12 * hour) - 90) + min / 60 * 30) * Math.PI / 180);
            context.beginPath()
            context.lineWidth = 12;
            context.moveTo(-10, 0)
            context.lineTo(100, 0)
            context.stroke()
            context.closePath()
            context.restore()
            context.save()
        }
        // 分针
        function dMinu(min) {
            context.rotate((360 / 60 * min - 90) * Math.PI / 180)
            context.beginPath()
            context.lineWidth = 8;
            context.strokeStyle = '#696969';
            context.moveTo(-10, 0)
            context.lineTo(180, 0)
            context.stroke()
            context.closePath()

            context.restore()
            context.save()
        }
        // 秒针
        function dSecd(sec) {
            context.rotate((360 / 60 * sec - 90) * Math.PI / 180)
            context.beginPath()
            context.lineWidth = 3;
            context.strokeStyle = '#1E90FF';
            context.moveTo(-20, 0)
            context.lineTo(200, 0)
            context.stroke()
            context.closePath()

            context.restore()
            context.save()
        }
        function yuan_in() {
            // 表盘内圆
            context.beginPath();
            context.lineWidth = 6;
            context.strokeStyle = '#1E90FF';//设置了颜色,为什么没变化
            context.arc(0, 0, 3, 0, 2 * Math.PI);  
            context.stroke();
            context.closePath();
            context.restore();  
            context.save();
        }
        function time() {
            var time = new Date(); // 获取当前时间
            var hour = time.getHours() % 12; //由于获取的小时是24小时制的,但是时钟是12小时制的
            var min = time.getMinutes();
            var sec = time.getSeconds();
            // console.log(hour)
            // console.log(min)
            // console.log(sec)
            context.clearRect(-400, -400, 1000, 1000); // 清除画布,不然指针转动后会留下痕迹
            body()
            yuan_out()
            num_hour()
            // num_min()
            dHour(hour, min)
            dMinu(min)
            dSecd(sec) // 调用上面所有函数
            yuan_in()
        }

        setInterval(time, 1000); // 设置定时器,每秒调用一次
    </script>
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值