新手小白包教包会的 —— canvas画时钟

本次画时钟的几个步骤: 1. 布置静态表盘。 2. 布置数字 3.设置时分秒的指针转动速度

技术点: canvas javaScript 

思路: 利用canvas画圆 利用 js获取时间戳,动态绘制表盘,实现时钟指针的走动。

关于canvas的简单介绍: canvas标签上要绑定宽,高; canvas的默认中心点为左上角,默认的水平方向为x轴;
3点在之后的时钟制作中都需要知道。


下面是思路详解:

  1. 静态表盘    
          这部分比较简单,基本都是canvas的API。


2. 布置数字

这部分的整体思路就是:设置fillText( 文本,  坐标x,  坐标y );(文本为:1,2,3,4...11,12)

重点是获取文本的坐标 x, y 

这里,我们利用的是Math的两个API : Math.sin 正弦 和 Math.cos 余弦 来求得当前的文字坐标x,y ( 不懂sin 和 cos 可以看一下勾股定理 )

因为canvas的默认圆心为左上角,所以,我们要移动圆心,分别加上宽 和 高 的 一半。



3.绘制指针

这部分就是之前说的,在一定的时间内重绘。来实现转动的效果

这里有一个clearRect(),清空给定矩形的指定像素

这里有一个地方需要注意:因为系统返回的时间是24小时制,表盘上是12小时制的,所以,是需要做一下判断的:

h > 12 ? h = h -12 : h;

这里绘制时分秒的方法是c.arc(x, y ,r , (h * 30 - 90) * Math.PI / 180,  (h * 30 + 1 - 90) * Math.PI / 180, false ) );

注意: 这里 要 - 90度的,之前提到的,canvas的默认水平方向是X轴。


到了这里,一个简单的时钟效果就制动完成了。如果有什么好的建议希望大家指出。

如果觉得对您有帮助,那就给个赞呗。

效果图、代码 如下:


<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
        <title>圆环</title>
    </meta>
    <style>
        #canvas {
            border: 1px solid #999;
        }
    </style>
</head>
<body>
    <canvas id="canvas" width="500" height="500">您的浏览器不支持canvas</canvas>
    <script>
        const ctx = document.getElementById("canvas");
        const c = ctx.getContext('2d');
        
        //静态表盘
        function start(){
            c.beginPath();
            c.arc(250,250,240,0,360);
            c.fillStyle='#000';
            c.fill();

            let deg = 70;
            let drawPosition = 180 - deg;        
            c.beginPath();
            c.moveTo(250,250);
            c.arc(250, 250, 250, -90 * Math.PI / 180, -45 * Math.PI / 180, false);
            c.fillStyle='red';
            c.fill();

            c.beginPath();
            c.arc(250,250,230, 0, 360);
            c.fillStyle='#999';
            c.fill();
        }

        //圆心 
        function origin(){
            c.beginPath();
            c.arc(250,250,5, 0, 360);
            c.fillStyle='black';
            c.fill();
        }
//数字
        function addText(){
            var houre = [6,5,4,3,2,1,12,11,10,9,8,7];
            for (var degNum = 0;degNum < 360; degNum += 30){  //数字
                var r = ctx.width / 2 * 0.8;
                var textX = r * Math.sin((degNum) * 2 * Math.PI/360) + ctx.width / 2;
                var textY = r * Math.cos((degNum) * 2 * Math.PI/360) + ctx.height / 2;
                c.font = r*0.1 + "px Arial"; 
                c.textBaseline = "middle";// 文字垂直对齐方式
                c.textAlign = "center";   // 文字水平对齐方式
                c.fillText(houre[degNum / 30],textX ,textY);
    //画刻度
                c.beginPath();
                c.arc(250,250,r*0.8,0,360); //圆
                c.strokeStyle='#fff';
                c.stroke();
            }
        }
        start();
        addText();
//获取时间
        setInterval(() => {
            var dataNow = new Date();
            var h = dataNow.getHours();
            var m = dataNow.getMinutes();
            var s = dataNow.getSeconds();
            h > 12 ? h = h -12 : h;
            c.clearRect(0,0,ctx.width,ctx.height);
            start();
            drawHours(h);
            drawMinutens(m);
            drawSecondes(s);
            origin();
            addText();
        },1000);

//绘制时
        function drawHours(h){
            c.save();
            c.beginPath();
            c.moveTo(250,250);
            c.arc(250,250,100,(h * 30 - 90) * Math.PI / 180, (h * 30 + 1 - 90)  * Math.PI / 180,false);
            c.fillStyle = '#000';
            c.fill();
            c.closePath();
            c.restore();
        }

//绘制分
        function drawMinutens(m){
            c.save();
            c.beginPath();
            c.moveTo(250,250); 
            c.arc(250, 250, 120, (m * 6 - 90) * Math.PI / 180, (m * 6 + 1 - 90) * Math.PI /180, false);
            c.fillStyle='yellow';
            c.fill();
            c.closePath();
            c.restore();
        }


//绘制秒
        function drawSecondes(s){
            c.save();
            c.beginPath();
            c.moveTo(250,250);
            c.arc(250,250,130,(s * 6 - 90) * Math.PI / 180, (s * 6 + 1 - 90)  * Math.PI / 180);
            c.fillStyle='#fff';
            c.fill();
            c.closePath();
            c.restore();
        }
        

    </script>
</body>
</html>


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值