美文网首页
canvas入门-小时钟

canvas入门-小时钟

作者: forLovn | 来源:发表于2016-10-11 22:08 被阅读0次

canvas入门-小时钟

html:
<body>
    <div>
        <canvas id="clock" height="200px" width="200px"></canvas>
    </div>

    <script type="text/javascript" src="clock.js"></script>
</body>

js:
/**
 * Created  on 2016/10/9.
 */
var dom=document.getElementById("clock");
var ctx=dom.getContext('2d');
var width=ctx.canvas.width;
var height=ctx.canvas.height;
var r=width / 2;

var rem=width/200;

function drawBackground() {
    ctx.beginPath();
    ctx.lineWidth=10 * rem;
    ctx.arc(0, 0, r-ctx.lineWidth / 2, 0, 2*Math.PI, false);
    ctx.strokeStyle="#eacd76";
    ctx.stroke();
    
    var hours =[3,4,5,6,7,8,9,10,11,12,1,2];
    ctx.font=18 * rem +'px Arial';
    ctx.textAlign="center";
    ctx.textBaseline="middle";
    hours.forEach(function (number ,i ) {
        var rad= 2 * Math.PI / 12 * i;
        var x= Math.cos(rad) * (r - 30 * rem);
        var y= Math.sin(rad) * (r - 30 * rem);
        ctx.fillText(number,x ,y);
    });

    for(var i=0 ;i<60 ;i++){
        var rad= 2 * Math.PI / 60 * i;
        var x= Math.cos(rad) * (r - 18 * rem);
        var y= Math.sin(rad) * (r - 18 * rem);
        ctx.beginPath();//起始一条路径,或重置当前路径
        if(i%5==0){
            ctx.fillStyle ='#000';
            ctx.arc(x, y, 2 * rem, 0, 2*Math.PI, false);
        }else{
            ctx.fillStyle ='#ccc';
            ctx.arc(x, y, 2 * rem, 0, 2*Math.PI, false);
        }
        ctx.fill();
    }
}
//x=r * cosT  y=

function drawHour(hour , minute) {
    ctx.save();

    ctx.beginPath();//起始一条路径,或重置当前路径
    var rad= 2 * Math.PI /12 *hour,
        mard= 2 * Math.PI /12 /60 * minute;
    ctx.rotate(rad + mard);
    ctx.lineCap='round';
    ctx.lineWidth=6 * rem;
    ctx.moveTo(0,10 * rem);
    ctx.lineTo(0,-r/2);
    ctx.strokeStyle="#f2be45";
    ctx.stroke();

    ctx.restore();
}

function drawMinute(minute) {
    ctx.save();

    ctx.beginPath();
    var rad= 2 * Math.PI /60 *minute;
    ctx.rotate(rad);
    ctx.lineCap='round';
    ctx.lineWidth=3;
    ctx.moveTo(0,10 * rem);
    ctx.lineTo(0,-r + 30 * rem);
    ctx.strokeStyle="#f2be45";
    ctx.stroke();

    ctx.restore();
}

function drawSecond(second) {
    ctx.save();

    ctx.beginPath();
    ctx.fillStyle='#c14543';
    ctx.lineWidth=1;
    var rad= 2 * Math.PI /60 *second;
    ctx.rotate(rad);
    ctx.moveTo(-2 * rem,20 * rem);
    ctx.lineTo(2 * rem ,20 * rem);
    ctx.lineTo(1,-r + 18* rem);
    ctx.lineTo(-1,-r + 18* rem);
    ctx.fill();

    ctx.restore();
}

function drawDot() {
    ctx.beginPath();
    ctx.fillStyle = '#fff';
    ctx.arc(0,0,3 * rem,0,2*Math.PI,false);
    ctx.fill();
}

function draw() {
    ctx.clearRect(0,0,width,height);//在给定的矩形内清除指定的像素

    ctx.save();//**保存当前环境的状态(此时的坐标原点(0,0)还是左上角)

    ctx.translate(r,r);//重新映射画布上的 (0,0) 位置
    //此时的坐标原点(0,0)已经移至到(r,r)

    var now=new Date(),
        hour=now.getHours(),
        minute=now.getMinutes(),
        seconed=now.getSeconds();
    drawBackground();
    drawHour(hour , minute);
    drawMinute(minute);
    drawSecond(seconed);
    drawDot();

    ctx.restore();//**返回之前保存过的路径状态和属性;
    //目的:clearRect(0,0,width,height);清除矩形的(0,0)点还原为左上角
}
setInterval(function(){
    draw()
},1000);

//小结:canvas入门的很好例子!赞
//
/*1:save() 与 restore() 成对出现一个是保存当前的状态,因一个是还原之前保存过的路径状态和属性;
* 2:beginPath()出场率较高--原因:起始一条路径,或重置当前路径都会调用此方法
* 3:画图的两种方式fill() 与 stroke()
* 4:创建线条lineTo();创建弧/曲线 arc()
* 5:改变绘制原点-重新映射画布上的 (0,0) 位置translate()
* 6:rotate(arg)旋转当前绘图 , 参数弧度制
* 7:弧度制,满圆的弧度=2 * Math.PI
* 8 :小时钟的自适应-等比放大 */

//扩展:可以用canvas绘制一个圆形的百分比视图会比svg简单很多吧,以后补充吧!

//最后感谢慕课网的老师传授canvas时钟的绘制,再次感谢!

相关文章

网友评论

      本文标题:canvas入门-小时钟

      本文链接:https://www.haomeiwen.com/subject/uaiyyttx.html