zoukankan      html  css  js  c++  java
  • js实现一个简单钟表动画(javascript+html5 canvas)

    第一次在博客园注册发博。有一次去人家单位开标,看到开标网站上有个钟表动画,一时兴起,就写了个简单的钟表动画。

    用js和html5 canvas对象实现一个简单钟表程序

    主要用到的就是h5的canvas对象

    canvas对象本人也不是很熟,大致看了几个常用的方法,难免有不足之处,仅是练习所用。

    实现思路:画表盘,画刻度,画表针就是这么个思路。

    主要就涉及到以下几个方法

    arc 创建弧/曲线(用于创建圆形或部分圆)

    rotate 旋转

    lineTo画线

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Js实现一个简单的钟表动画</title>
    <style type="text/css">
    canvas{
    
        margin-left:500px;
        margin-top:100px;
    
    }
    
    </style>
    </head>
    
    <body>
    <canvas id="canvas" width="600" height="600"></canvas>
    <script language="javascript">
    /*
    作者:胖兔
    时间:2017.8.9
    描述:用js和html5 canvas对象实现一个简单钟表程序
    */
    
    
    var Canvas = {
    
    //属性
        Context:document.getElementById("canvas").getContext('2d'),
    
    //擦除
        Clear:function(){
        
            var cxt = Canvas.Context;
            var width = cxt.canvas.width;
            var height =  cxt.canvas.height;;
            this.Context.clearRect(0,0, width, height);
        },
        //radius钟表半径,sencondScaleWidth刻度长度,secondHandWidth秒针长度
        CreateClock:function(radius,sencondScaleWidth,secondHandWidth){
            var me = this;
            var radius = radius;
            var sencondScaleWidth = sencondScaleWidth;
            var secondHandWidth = secondHandWidth;
            //小时刻度
            var hourScaleWidth = sencondScaleWidth*2;
            //时针分针长度
            var hourHandWidth = secondHandWidth*80/100;
            //分针长度
            var minuteHandWidth = secondHandWidth*90/100; 
            //确定圆心坐标
            var point = {x:this.Context.canvas.width/2,y:this.Context.canvas.height/2};
            var ctx = this.Context;//获取上下文
            //绘制圆圈
            
            function drawCircle(){
            
                ctx.save();//记录画笔状态
                //确定画笔的位置在圆心点
                ctx.translate(point.x,point.y);
                //ctx.fillStyle = "black";
                ctx.strokeStyle="gray";
                ctx.lineWidth = 2;
                ctx.beginPath();//开始绘制路径
                ctx.arc(0,0,radius,0,Math.PI*2);
                ctx.closePath();//关闭路径
                ctx.stroke();//绘制
                ctx.restore();//复位
                
            
            }
            //绘制刻度
            function drawScale(){
                ctx.save();//记录画笔状态
                var perHourRadian = Math.PI/6;
                var perMinuteRadian = Math.PI/30;
                //确定画笔的位置在圆心点
                ctx.translate(point.x,point.y);
                ctx.strokeStyle="gray";
                
                //此处为了省事,只在表盘上简单的写了几个时间数字
                ctx.font = "bold 30px impack"
                var dc = radius-hourScaleWidth-30;
                ctx.fillText("3", dc, 10);
                ctx.fillText("6", -10,dc );
                ctx.fillText("9", -dc, 10);
                ctx.fillText("12", -15, -dc);
                ctx.stroke();
                
                for(var i=0;i<12;i++){
                    //坐标旋转
                    ctx.rotate(perHourRadian);
                    ctx.moveTo(radius-hourScaleWidth,0);
                    ctx.lineTo(radius,0);
                }
                
                for(var i=0;i<60;i++){
                    //坐标旋转
                    ctx.rotate(perMinuteRadian);
                    ctx.moveTo(radius-sencondScaleWidth,0);
                    ctx.lineTo(radius,0);
                }
                
                ctx.stroke();//绘制
                ctx.restore();
                
                //radian 
            }
            //drawScale();
            function drawHand(){
                
                var myDate = new Date();
                var curHour = myDate.getHours();
                var curMinute = myDate.getMinutes();
                var curSecond = myDate.getSeconds();
    
                //绘制时针
                curHour = curHour>12?curHour-12:curHour;
                var hourRadian = (curHour+curMinute/60+curSecond/3600) * (Math.PI/6);
                //绘制分针
                var minuteRadian = (curMinute+curSecond/60) * (Math.PI/30);
                //绘制秒针
                var secondRadian = curSecond * (Math.PI/30);
                
                function run(radian,width,color){
                    ctx.save();
                    ctx.translate(point.x,point.y);
                    ctx.rotate(-Math.PI/2);
                    ctx.strokeStyle=color
                    ctx.beginPath();
                    ctx.rotate(radian);
                    ctx.moveTo(0,0);
                    ctx.lineTo(width,0);
                    ctx.closePath();
                    ctx.stroke();
                    ctx.restore();
                }
                run(hourRadian,hourHandWidth,"black");
                run(minuteRadian,minuteHandWidth,"green");
                run(secondRadian,secondHandWidth,"red");
    
            
            }
            //drawHand();
            function drawAll(){
                me.Clear();
                drawCircle();
                drawScale();
                drawHand();
            }
            setInterval(drawAll,1000);
            
            
            
        
        }
    
    };
    
    
    
    
    
    
    Canvas.CreateClock(290,20,200);
    
    </script>
    </body>
    </html>

     

  • 相关阅读:
    Android开发环境下关于如何导出手机通讯录数据库【Written By KillerLegend】
    Win+R快速打开你的应用程序
    public void onItemClick(AdapterView arg0, View view, int position,long arg3)详解【整理自网络】
    Adapter的getView方法详解
    LayoutInflater中四种类型inflate方法的介绍
    程序员电脑桌面,哪一张触动了你?
    o​r​a​c​l​e​ ​O​D​B​C​配​置 图形界面
    C#String与string大小写的区别
    怎么使用FlashFXP上传网站
    C#操作Excel文件
  • 原文地址:https://www.cnblogs.com/pangtu/p/7323551.html
Copyright © 2011-2022 走看看