canvas动态时钟(老师写的)

<!DOCTYPE html>
<html>
<head>
    <title>动态时间.html</title>
    <meta charset="UTF-8">
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">

    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
    <script type="text/javascript">
        function test() {
            //清除画布上旧的内容,防止新旧内容重叠
            ctx.clearRect(0, 0, 1000, 500);

            ctx.save();//保存当前状态
            ctx.translate(500, 250);//设置新的原点位置
            //绘制数字
            for (var i = 0; i < 12; i++) {
                var x = (i * 30 - 90) * (Math.PI / 180);
                ctx.fillText(i, 187 * Math.cos(x), 187 * Math.sin(x));
                console.log(x);
            }


            //时针,分钟,秒针  时刻度 分刻度  中心[针交叉点] 都受此次位置影响
            ctx.rotate(-90 * Math.PI / 180);//角度由3点钟位置,旋转到12点钟位置

            //绘制圆: 表框
            ctx.beginPath();
            ctx.arc(0, 0, 200, 0, 2 * Math.PI);
            ctx.strokeStyle = "#9932CC";
            ctx.lineWidth = "2";
            ctx.stroke();

            //绘制矩形: 时刻度
            ctx.save();//保存当前状态
            ctx.rotate(30 * Math.PI / 180);
            /*for (var i = 1; i <=12; i++) {
             //ctx.fillRect(185,0,15,5);
             ctx.fillText(i,187,0)
             ctx.rotate(30*Math.PI/180);
             }*/
            ctx.restore();//恢复

            //绘制矩形: 分刻度
            ctx.save();//保存当前状态
            for (var i = 0; i < 60; i++) {
                if (i % 5 != 0) {
                    ctx.fillRect(190, 0, 10, 2);
                }
                ctx.rotate(6 * Math.PI / 180);
            }
            ctx.restore();//恢复

            //绘制圆形: 表中心
            ctx.save();//保存当前状态
            ctx.beginPath();
            ctx.arc(0, 0, 5, 0, 2 * Math.PI);
            ctx.fill();
            ctx.restore();//恢复


            var date = new Date();//获得当前日期
            var h = date.getHours();
            var m = date.getMinutes();
            var s = date.getSeconds();
            //绘制时针
            hourPoint(h, m, s);
            //绘制分针
            minuPoint(m, s);
            //绘制秒针
            secPoint(s);

            ctx.restore();//恢复: 取消 整体旋转的90        }
        function hourPoint(h, m, s) {
            ctx.save();
            //i=i>12?(i-12):i;
            //设置旋转角度: 1小时30度 计算出 当前总共的小时数[,,] *30即可
            ctx.rotate((h + m / 60 + s / 3600) * 30 * Math.PI / 180);
            //绘制时针
            ctx.beginPath();
            ctx.moveTo(-20, -2);//左下角
            ctx.lineTo(-20, 2);//右下角
            ctx.lineTo(80, 2);//右中角
            ctx.lineTo(100, 1);//右上角
            ctx.lineTo(100, -1);//左上角
            ctx.lineTo(80, -2);//左中角
            ctx.closePath();
            ctx.fill();
            ctx.restore();
        }
        function minuPoint(m, s) {
            ctx.save();
            //设置旋转角度: 1分钟6度 计算出 当前 总分钟数[,]*6
            ctx.rotate((m + s / 60) * 6 * Math.PI / 180);
            //绘制分针
            ctx.beginPath();
            ctx.moveTo(-15, -3);//左下角
            ctx.lineTo(-15, 3);//右下角
            ctx.lineTo(100, 3);//右中角
            ctx.lineTo(150, 1);//右上角
            ctx.lineTo(150, -1);//左上角
            ctx.lineTo(100, -3);//左中角
            ctx.closePath();
            ctx.fill();
            ctx.restore();
        }
        function secPoint(s) {
            ctx.save();
            //设置旋转角度: 16 [分针和秒针 每次都是跳1,6]
            ctx.rotate(s * 6 * Math.PI / 180);
            //绘制秒针
            ctx.beginPath();
            ctx.moveTo(-10, -5);//左下角
            ctx.lineTo(-10, 5);//右下角
            ctx.lineTo(100, 5);//右中角
            ctx.lineTo(185, 1);//右上角
            ctx.lineTo(185, -1);//左上角
            ctx.lineTo(100, -5);//左中角
            ctx.closePath();
            ctx.fill();
            ctx.restore();
        }

        function showTime() {
            var c = document.getElementById("myCanvas");
            ctx = c.getContext("2d");
            //ctx.strokeRect(0,0,100,100);
            setInterval(function () {
                test();//绘制表盘
            }, 100);
        }
    </script>
</head>

<body>
<!--
* 思路:
* 1.绘制的起始角为 3点钟位置[水平线 右侧],时钟起点为12点钟位置[垂直线 上侧],因此需要处理角度偏差
* 解决办法:
* 第一种: 绘制之前,整体旋转-90,将起始角旋转到 12点钟位置[X差值大,Y差值小]
* 第二种: 不做整体旋转,制作时针,分针,秒针时 朝向12点位置即可[Y差值大,X差值小]
* 2.绘制刻度: 时刻度和分刻度分开处理.
* 绘制时刻度之前,保存环境,绘制结束后恢复环境,防止多次旋转造成角度误差.
* 绘制分刻度,同理
* 3.计算表针旋转度数
* 时针角度: 当前时+分钟转为时+秒转为时=总时  ,比如 1:30:30 1.5083
* 分针角度: 当前分+秒转为分=总分, 比如: 30:30 30.5
* 角度: 30/  6/  6/ -->
<div style="width: 200px;margin: 10px auto;">
    <input type="button" value="绘制" οnclick="showTime()"><br>
</div>
<canvas id="myCanvas" width="1000" height="500" style="border: 1px #ccc solid;margin:0 auto;display:block;">
    对不起,您的浏览器不支持canvas标签
</canvas>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值