zoukankan      html  css  js  c++  java
  • canvas 实现时钟

     

    l Canvas绘制钟表

    绘制钟表

    3.1.1. 效果

           

     

     功能实现

    l 绘制表盘

    // 1 绘制表盘

    cxt.beginPath();

    cxt.arc(250,250,r,0,Math.PI*2);

    cxt.closePath();

    cxt.fillStyle='white';

    cxt.fill();

    cxt.strokeStyle='steelblue';

    cxt.lineWidth=20

    cxt.stroke();

    l 绘制刻度

     

     

    // 2  绘制刻度

    // 2-1时针刻度

    for(var i=0; i<12;i++){

    getLine(Math.PI/180*i*30,-190,-170,'black',5);

    }

    // 2-2分针刻度

    for(var i=0; i<60;i++){

    getLine(Math.PI/180*i*6,-190,-180,'black',3);

    }

     

    // 定义生成刻度方法

    function getLine(rotate,moveTo,lineTo,color,width){

    cxt.save();

    cxt.translate(250,250);

    cxt.rotate(rotate)

    cxt.beginPath();

    cxt.moveTo(0,moveTo);

    cxt.lineTo(0,lineTo);

    cxt.closePath();

    cxt.strokeStyle=color;

    cxt.lineWidth=width;

    cxt.stroke();

    cxt.restore();

    }

     

    l 计算文字坐标

     

    顺时针公式:

    Y = Math.sin(弧度)*r;

    X =Math.cos(弧度)*r

    逆时针公式:

    Y = Math.cos(弧度)*r;

    X =Math.sin(弧度)*r

     

    //  3 绘制文字

    // 顺时针公式:

    // Y = Math.sin(弧度)*r;

    // X =Math.cos(弧度)*r

    let text = [3,4,5,6,7,8,9,10,11,12,1,2]

    for(var i=0;i<12;i++){

    // 计算文字的坐标

    let x = Math.cos(Math.PI/180*i*30)*r*0.7+250;

    let y = Math.sin(Math.PI/180*i*30)*r*0.7+250;

     

    cxt.font='20px 楷体';

    cxt.fillStyle='black';

    cxt.textAlign='center';

    cxt.textBaseline='middle'

    cxt.fillText(text[i],x,y);

     

    }

     

    l 绘制中间空心圆

    // 4 绘制中心空心圆

    cxt.beginPath();

    cxt.arc(250,250,15,0,Math.PI*2);

    cxt.closePath();

    cxt.strokeStyle='black';

    cxt.lineWidth=1

    cxt.stroke();

     

    l 绘制小时

    //  5 绘制指针

    let time = new Date();

    let h = time.getHours();

    let m = time.getMinutes();

    let s = time.getSeconds();

    // h =

    getLine(Math.PI/180*h*30,-120,30,'steelblue',10);

    getLine(Math.PI/180*m*6,-130,20,'orange',5);

    getLine(Math.PI/180*s*6,-155,10,'red',3);

     

     

    l  绘制中间实心圆

    // 6 绘制中心实心圆

    cxt.beginPath();

    cxt.arc(250,250,5,0,Math.PI*2);

    cxt.closePath();

    cxt.fillStyle='black';

    cxt.fill();

    附上源码:

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <canvas id="canvas" width="500" height="500"></canvas>
            <style type="text/css">
                canvas{
                    background-color: #DDD;
                }
            </style>
        </head>
        
        <script type="text/javascript">
            let canvas = document.getElementById('canvas');
            
            if(canvas.getContext('2d')){
                let cxt = canvas.getContext('2d');
                
                setInterval(()=>{
                    getTime();
                },1000)
                
                
                function getTime(){
                    let r = 200;
                    
                    // 绘制表盘
                    cxt.beginPath();
                    cxt.arc(250,250,r,0,Math.PI*2);
                    cxt.closePath();
                    cxt.fillStyle='white';
                    cxt.fill();
                    cxt.strokeStyle='steelblue';
                    cxt.lineWidth=20
                    cxt.stroke();
                    
                    // 2  绘制刻度
                    // 2-1时针刻度
                    for(var i=0; i<12;i++){
                        getLine(Math.PI/180*i*30,-190,-170,'black',5);
                    }
                    // 2-2分针刻度
                    for(var i=0; i<60;i++){
                        getLine(Math.PI/180*i*6,-190,-180,'black',3);
                    }
                    
                    //  3 绘制文字
                    //     顺时针公式:
                    //     Y = Math.sin(弧度)*r;
                    //     X =Math.cos(弧度)*r
                    let text = [3,4,5,6,7,8,9,10,11,12,1,2]
                    for(var i=0;i<12;i++){
                        // 计算文字的坐标
                        let x = Math.cos(Math.PI/180*i*30)*r*0.7+250;
                        let y = Math.sin(Math.PI/180*i*30)*r*0.7+250;
                        
                        cxt.font='20px 楷体';
                        cxt.fillStyle='black';
                        cxt.textAlign='center';
                        cxt.textBaseline='middle'
                        cxt.fillText(text[i],x,y);
                        
                    }
                    
                    // 4 绘制中心空心圆
                    cxt.beginPath();
                    cxt.arc(250,250,15,0,Math.PI*2);
                    cxt.closePath();
                    cxt.strokeStyle='black';
                    cxt.lineWidth=1
                    cxt.stroke();
                    
                    
                     // 5 绘制指针
                    let time = new Date();
                    let h = time.getHours();
                    let m = time.getMinutes();
                    let s = time.getSeconds();
                     
                     // 改成十二小时制
                    h = h > 12 ? (h-12) + m/60 : h + m/60;
                    
                    getLine(Math.PI/180*h*30,-120,30,'steelblue',10);
                    getLine(Math.PI/180*m*6,-130,20,'orange',5);
                    getLine(Math.PI/180*s*6,-155,10,'red',3);
                    
                    // 6 绘制中心实心圆
                    cxt.beginPath();
                    cxt.arc(250,250,5,0,Math.PI*2);
                    cxt.closePath();
                    cxt.fillStyle='black';
                    cxt.fill();
                    
                    // 定义生成刻度方法
                    function getLine(rotate,moveTo,lineTo,color,width){
                        cxt.save();
                        cxt.translate(250,250);
                        cxt.rotate(rotate)
                        cxt.beginPath();
                        cxt.moveTo(0,moveTo);
                        cxt.lineTo(0,lineTo);
                        cxt.closePath();
                        cxt.strokeStyle=color;
                        cxt.lineWidth=width;
                        cxt.stroke();
                        cxt.restore();
                    }
                }
            }else{
                console.log('请更换浏览器')
            }
            
        </script>
        <body>
        </body>
    </html>
  • 相关阅读:
    Disruptor-NET和内存栅栏
    SSDB:高性能数据库服务器
    PostgreSQL配置优化
    ADO.NET的弹性连接控制[ADO.NET idle connection resiliency]
    2013年度IT博客大赛跻身10强
    MongoDB 聚合管道(Aggregation Pipeline)
    验证码类库CaptchaMvc
    AngularJS SPA Template For Visual Studio
    .NET 4.0 版本号
    利用SSH Filesystem实现远程文件系统
  • 原文地址:https://www.cnblogs.com/ximenchuifa/p/13963479.html
Copyright © 2011-2022 走看看