h5 canvas绘制的时钟

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>$Title$</title>
</head>
<body>
<canvas id="canvas" width="800" height="600" style="border:1px solid red"></canvas>
</body>
<script src="jquery-2.1.4.js"></script>
<script>
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");

    /**
     *
     * Created by ChengXiancheng on 2017/3/11.
     */


    function Clock(opt){

        $.extend(this,opt);

        this.ctx.font=this.fontSize+" "+this.fontFamily;
        this.ctx.textAlign="center";
        this.ctx.textBaseline="middle";

        this.init();
    }
    Clock.prototype={
        constructor:Clock,
        init:function(){
            var self=this;
            var ctx=self.ctx;
            this.timer=setInterval(function(){
                ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height);

                //绘制大圆
                self.drawBigCircle();
                //绘制刻度盘
                self.drawDial();
                //绘制指针
                self.drawPoints();
            },1000);



        },
        drawPoints:function(){
            //根据指定的时间绘制指针
            var date=new Date();

            var hour=date.getHours();//小时数:0-23之间
            var hour2=hour%12;//计算出0-11之间的值
            //发现0位于-PI/2
            //计算时针的弧度值
            //      a、计算相邻时针之间的弧度差
            //      b、弧度差*时间
            //      c、发现"0"位于-PI/2的弧度,所以应该把上面的结果减去PI/2
            var hourRadian=2*Math.PI/12*hour2-Math.PI/2;
            //绘制指针
            this.drawPoint(20,hourRadian,"red",8);

            var minute=date.getMinutes();//分钟数:0-59
            var minuteRadian=2*Math.PI/60*minute-Math.PI/2;
            //绘制指针
            this.drawPoint(50,minuteRadian,"green",5);

            var second=date.getSeconds();//秒数:0-59
            var secondRadian=2*Math.PI/60*second-Math.PI/2;
            //绘制指针
            this.drawPoint(70,secondRadian,"blue",3);
        },

        drawBigCircle:function(){
            var ctx=this.ctx;

            ctx.save();
            ctx.strokeStyle="#335F9A";
            ctx.lineWidth=10;

            ctx.beginPath();
            ctx.arc(this.bigX,this.bigY,this.bigRadius,0,2*Math.PI);
            ctx.stroke();

            ctx.restore();
        },
        //绘制刻度盘
        drawDial:function(){

            var bigRadius=this.bigRadius-10/2;//减去大圆的线宽的一半

            var ctx=this.ctx;

            //第一个刻度线位于大圆的弧度值
            var start=-Math.PI/3;

            var radian=2*Math.PI/60;//相邻刻度线之间的弧度差

            for (var i = 0; i < 60; i++) {
                //计算出每一个刻度线的弧度值
                var smallRadian=start+radian*i;

                var length,lineWidth;//保存刻度线的线宽
                //2种刻度,i5整除是长刻度,其他都是短刻度
                if(i%5==0){
                    length=this.bigLength;
                    lineWidth=this.bigWidth;

                    //指定文字与大圆圆心之间的距离
                    this.drawText(i/5+1,smallRadian);

                }else{
                    length=this.smallLength;
                    lineWidth=this.smallWidth;
                }

                var h1=Math.sin(smallRadian)*(bigRadius-length);
                var b1=Math.cos(smallRadian)*(bigRadius-length);

                var h2=Math.sin(smallRadian)*bigRadius;
                var b2=Math.cos(smallRadian)*bigRadius;

                //刻度线起点坐标
                var x1=this.bigX+b1,y1=this.bigY+h1;
                //刻度线的终点坐标
                var x2=this.bigX+b2,y2=this.bigY+h2;

                ctx.save();
                ctx.lineWidth=lineWidth;

                ctx.beginPath();
                ctx.moveTo(x1,y1);
                ctx.lineTo(x2,y2);
                ctx.stroke();

                ctx.restore();

                //刻度线的起始坐标和结束坐标的推导公式:
                // sin smallR=h1/(bigR-length)
                // -->h1=sin smallR*(bigR-length)
                // -->b1=cos smallR*(bigR-length)
                //
                // sin smallR=h2/bigR
                // -->h2=sin smallR*bigR;
                // -->b2=cos smallR*bigR;
                //
                // x1=bigX+b1,y1=bigY+h1
                // x2=bigX+b2,y2=bigY+h2;

            }
        },

        drawText:function(text,smallRadian){
            //指定文字与大圆圆心之间的距离
            var r=110;
            var b3=Math.cos(smallRadian)*r;
            var h3=Math.sin(smallRadian)*r;
            //计算文字的坐标
            var x3=this.bigX+b3,y3=this.bigY+h3;

            this.ctx.fillText(text,x3,y3);
        },

        /**
         *
         * @param length 指针的长度
         * @param radian 指针的终点位于大圆的弧度值
         */
        drawPoint:function(length,radian,color,width){
            var b=Math.cos(radian)*length;
            var h=Math.sin(radian)*length;

            //计算出指针终点的坐标
            var x=this.bigX+b,y=this.bigY+h;

            //绘制指针:
            var ctx=this.ctx;

            ctx.save();
            ctx.beginPath();

            ctx.moveTo(this.bigX,this.bigY);
            ctx.lineTo(x,y);
            ctx.strokeStyle=color;
            ctx.lineWidth=width;
            ctx.stroke();

            ctx.restore();
        }
    }



    //要绘制大圆:必须知道大圆的圆心和半径
    //要绘制刻度线,必须要知道刻度线的长度和线宽
    //要绘制文字:必须要知道:文字大小,字体,颜色
    var clock=new Clock({
        ctx:ctx,
        bigX:300,
        bigY:300,
        bigRadius:150,
        bigLength:20,
        smallLength:8,
        bigWidth:8,
        smallWidth:4,
        fontSize:"20px",
        fontFamily:"微软雅黑",
        fontColor:"red"
    })
</script>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITzhongzi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值