zoukankan      html  css  js  c++  java
  • HTML5 Canvas 绘制时钟

    HTML5 Canvas 绘制时钟

    2013-01-29 15:47 by VVG, 315 阅读, 0 评论, 收藏编辑

    demo演示:

    context.translate(x,y)方法,重新设置画布的坐标源点,设置后,x,y坐标处为变为起始坐标(0,0);

    context.arc(圆心x坐标, 圆心Y坐标, 圆半径, 起始弧度,结束点弧度, 是否顺时针) 方法绘制圆形,或者圆弧;

    context.rotate(弧度) 方法接受一个弧度制参数,旋转画布,然后绘制图形,相当于给绘制的图形旋转一个角度;

    context.save() 和 context.restore() 方法,记录起始状态和回复状态

    context.fillRect(矩形左上角X坐标,Y坐标,宽度,高度):  绘制矩形

    context.fillText(text,左上角x坐标,Y坐标): 绘制文字

    canvas 动画就是不断清除重绘的过程

    角度弧度制转换,高中课本上有,都忘得差不多了,如下:

    弧度制单位:rad    角度制单位:度        →      180度 = PI弧度    →        1度 = PI弧度/180度      →       1弧度= 180度/PI弧度

    得出角度转换公式 ↓↓↓↓↓

    弧度 = 角度*PI/180

    角度 = 弧度*180/PI

    代码如下:

    复制代码
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>canvas绘制时钟</title>
    </head>
    <body>
    <canvas id="graph" width="500px" height="500">你的浏览器不支持canvas</canvas>
    <script type="text/javascript">
        var canvas = document.getElementById('graph');
        var context = canvas.getContext('2d');
        var r = canvas.width/2.5;  //半径
        //将坐标中心作为起启点
        context.translate(canvas.width / 2, canvas.height / 2);
    
        function drawCircle() {
            context.beginPath();
            context.lineWidth = 5;
            context.strokeStyle = "#000";
            context.arc(0, 0, r, 0, Math.PI * 2, true);
            context.stroke();
            context.closePath();
        }
    
        function drawClockScale() {
            var rad = 0, angle;
            context.fillStyle = '#000';
            // 绘制表盘时刻度
            for (var i = 0; i < 12; i++) {
                context.save();
                rad = i * Math.PI / 6;  // 弧度制,大刻度,总共分为12刻度,每刻度为:2π/12 → π/6
                context.rotate(rad);  // 旋转画布绘制刻度
                context.fillRect(r - 10, 0, 10, 5);
                context.restore();
            }
            // 绘制表盘分刻度
            for (i = 0; i < 60; i++) {
                context.save();      // 记录旋转画布之前初始状态
                rad = i*Math.PI/30;
                context.rotate(rad);  // 旋转画布绘制刻度
                context.fillRect(r - 10, 0, 5, 2);   //绘制
                context.restore();  // 恢复初始状态,未旋转前
            }
    
            // 绘制表盘文字
            for(i=0;i<12;i++){
                context.save();
                var font = i + 3;    // 0弧度的时候是3点
                if(font>12) font = font - 12;
                rad = i * Math.PI / 6;
                context.rotate(rad);
                context.fillStyle = "#000";
                context.font = "bold 14px 微软雅黑";
                context.fillText(font,r - 30, 5);
                context.restore();
            }
        }
    
        function drawHand(rotate,width,height){
            context.save();
            rotate = rotate*Math.PI/180;      // 转换为弧度制
            context.rotate(rotate);
            context.fillRect(-10,0,width,height);
            context.restore();
        }
    
        function setTime(){
            var hour = new Date().getHours();
            var minute = new Date().getMinutes();
            var second = new Date().getSeconds();
    
            //hour = 15; minute = 30;
            //console.log(hour + ':' + minute + ':' + second);
            var hourRotate,minRotate,secRotate;
            // 计算秒针角度并绘制图形
            secRotate = second*6-90;
            drawHand(secRotate,r-30,2);
            // 计算分针角度并绘制图形
            minRotate = (minute*60 + second)*0.1 - 90;
            drawHand(minRotate,r-50,4);
            // 计算时针角度并绘制图形
            hourRotate = (hour*60*60 + minute*60 + second)/120 - 90;
            drawHand(hourRotate,r-70,5);
        }
    
        setInterval(function(){
            context.clearRect(-canvas.width / 2,-canvas.height / 2,canvas.width,canvas.height);
            drawCircle();
            drawClockScale();
            setTime();
        },1000);
    
    </script>
    
    </body>
    </html>
    复制代码

    转载请注明出处:http://www.cnblogs.com/NNUF/

     
    分类: HTML5JS原创
  • 相关阅读:
    Three.js中引入dat.gui库实现界面组件控制动画速度变量
    Three.js中使用requestAnimationFrame方法实现立方体转动和小球跳动的动画
    Windows下使用Java API操作HDFS的常用方法
    Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS
    HDFS的访问方式之HDFS shell的常用命令
    CentOS7上搭建Hadoop集群(入门级)
    CentOS7中怎样安装JDK与配置环境变量
    【2021-08-05】哪怕天踏下来,也要当被子盖
    【2021-08-04】连岳摘抄
    【2021-08-03】里程碑
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2881740.html
Copyright © 2011-2022 走看看