canvas畫時鐘,重拾樂趣!

LonaKXUR 7年前發布 | 14K 次閱讀 前端技術 canvas

canvas時鐘--效果圖

一、先來簡單介紹畫時鐘需要的canvas知識

1.在HTML頁面中添加canvas元素,必須定義canvas元素的id屬性值以便接下來的調用。

HTML代碼:

<canvas id="canvas" class="canvas" width="400" height="400" border:></canvas>

2.使用id尋找canvas元素,在js代碼中使用document.getElementById()等方法獲取id。

var canvas = document.getElementById("canvas");

3.通過canvas元素的getContext方法來獲取其上下文(Context),即創建Context對象,以獲取允許繪畫的2D環境。

var ctx = canvas.getContext("2d");

4.先來認識一下canvas的繪制方法。

(1)繪制矩形的兩種方法:fillRect 和 strokeRect

前者用于繪制用顏色填充(fill)區域的矩形,后者用于繪制輪廊(stroke)或線條。圖形指定顏色用到了兩個屬性,即fillStyle 和 strokeStyle,前者用于指定要繪制的填充區域的顏色,后者用于指定要繪制的線條顏色。

//繪制填充顏色矩形,默認黑色
ctx.fillStyle="red";
ctx.fillRect(0,0,200,100);

//繪制有顏色線條
ctx.strokeStyle="blue";
ctx.strokeRect(0,0,100,50);

(2)繪制圓形

繪制圓形是會用到四種方法:beginPath、arc、closePath和fill或stroke。

//畫圓填充紅顏色
//繪制園用法:ctx.arc(x,y,radius,startAngle,endAngle,anticlockwise);
ctx.beginPath();
ctx.fillStyle="red";
ctx.arc(0,0,100,0,2*Math.PI,true);
ctx.closePath();
ctx.fill();

//線條藍色畫圓
ctx.beginPath();
ctx.strokeStyle="blue";
ctx.lineWidth=10;//設置線條寬度
ctx.arc(0,0,174,0,Math.PI*2,true);
ctx.stroke();

(3)繪制直線

用到兩個主要方法:moveTo 和 lineTo 以及stroke。

ctx.moveTo(x,y)——規定線起始點(x,y)。ctx.lineTo(x,y)——規定直線路線的終點。

ctx.moveTo(0,0);
ctx.lineTo(200,100);
ctx.stroke();//該方法用于沿該路徑繪制線條

二、畫canvas時鐘過程

首先,定義畫布字體的為圓角,讓我們看起來美美的:ctx.lineCap="round";

其次,非常重要,時鐘是隨著時分秒針的轉動而轉動的,so——我們需要畫布范圍內必須設計畫布不斷清除和刷新:ctx.clearRect(0,0,400,400);

再次,一個畫布初始中心點(0,0)是在畫布左上角,so——畫時鐘需要把中心點轉移:ctx.translate(200,200);

最后,也是最重要的,每多一個save()保存就必須在下面補上一個還原restore();

1、畫分刻線

畫線嘛,上面咱們已經講過畫線的步驟,就不多說啦!只需要注意用到rotate()方法將,先用ctx.moveTo(),ctx.lineTo在畫布右側畫出第一根分刻線,再定義需要旋轉的角度變量——rotateD,經過ctx.rotate(rotateD)方法來for循環以及畫布不斷清除刷新的狀態,即可畫出分刻線。

當然這里還需要注意一點:畫布需要用到另個方法來包含要執行的內容,分別是save()、restore()。save() 方法把當前狀態的一份拷貝壓入到一個保存圖像狀態的棧中。這就允許你臨時地改變圖像狀態,然后,通過調用 restore() 來恢復以前的值。我打個比喻:我有一只手,戴上手套去完成一些事情,手套摘下來之后,我的手還是我的手。額,有點。。。呵呵

//畫刻度線
        for (var i = 0; i < 60; i++) {
            ctx.save();
            ctx.beginPath();
            var rotateD = i*Math.PI*2/60;
            ctx.rotate(rotateD);
            ctx.lineWidth = 4;
            ctx.moveTo(170,0);
            ctx.lineTo(160,0);
            ctx.stroke();
            ctx.restore();
        };

2、畫時刻線

同理,畫時刻線只需要修改線寬以及旋轉角度

3、畫時針

在前面new一個data變量var date = new Date;,并且定義一個時針隨時間變化旋轉角度也變化的變量rotateH。

小時針旋轉角度rotateH;

公式:rotateH = 時針旋轉角度 +分針旋轉角度/12 - 直角 = data.getHours()/12*2*Math.PI + date.getMinutes()/60/12*Math.PI*2 - Math.PI/2;

(為什么會減Math.PI/2呢,因為時針的初始值為(-12,0)、(125,0);針指向正好是在三點中位置,所以需要減掉一個直角才能從十二點開始旋轉)。

4、畫分針

定義一個分針隨時間變化旋轉角度也變化的變量rotateM。

公式:rotateM = 分針旋轉角度 + 秒針旋轉角度/60 -直角 = date.getMinutes()/60*Math.PI*2 + date.getSeconds()/60/60*Math.PI*2 - Math.PI/2;

5、畫秒針

定義一個分針隨時間變化旋轉角度也變化的變量rotateS。

公式:rotateM = 秒針旋轉角度 - 減直角 = date.getSeconds()/60*Math.PI*2 - Math.PI/2;

6、時針數字略

三、canvas實現時鐘完整代碼

js完整代碼:

jQuery(function($){
    function clock(){
        var canvas= document.getElementById("canvas");
        var ctx = canvas.getContext("2d");
        var date = new Date;
        ctx.lineCap = "round";//字體變圓角
        ctx.clearRect(0,0,400,400);//不斷清除畫布 不斷再執行刷新

        ctx.save();//每多一個保存就必須在下面補上一個還原restore()
        ctx.translate(200, 200);//中心點轉移

        //畫刻度線
        for (var i = 0; i < 60; i++) {
            ctx.save();
            ctx.beginPath();
            var rotateD = i*Math.PI*2/60;
            ctx.rotate(rotateD);
            ctx.lineWidth = 4;
            ctx.moveTo(170,0);
            ctx.lineTo(160,0);
            ctx.stroke();
            ctx.restore();
        };
        for (var i = 0; i < 12; i++) {
            ctx.save();
            ctx.beginPath();
            var rotateB = i*Math.PI*2/12;
            ctx.lineWidth = 6;
            ctx.rotate(rotateB);
            ctx.moveTo(170,0);
            ctx.lineTo(150,0);
            ctx.stroke();
            ctx.restore();
        };
        //畫時針
        var rotateH = date.getHours()/12*Math.PI*2 + date.getMinutes()/60/12*Math.PI*2 - Math.PI/2;
        ctx.save();
        ctx.beginPath();
        ctx.rotate(rotateH);
        ctx.lineWidth=12;
        ctx.moveTo(-12,0);
        ctx.lineTo(125,0);
        ctx.stroke();
        ctx.restore();

        //畫分針
        var rotateM = date.getMinutes()/60*Math.PI*2 + date.getSeconds()/60/60*Math.PI*2 - Math.PI/2;
        ctx.save();
        ctx.strokeStyle="red";
        ctx.beginPath();
        ctx.rotate(rotateM);
        ctx.lineWidth=9;
        ctx.moveTo(-12,0);
        ctx.lineTo(135,0);
        ctx.stroke();
        ctx.restore();

        //畫秒針
        var rotateS = date.getSeconds()/60*Math.PI*2 - Math.PI/2;
        ctx.save();
        ctx.strokeStyle="red";
        ctx.beginPath();
        ctx.rotate(rotateS);
        ctx.lineWidth=6;
        ctx.moveTo(-16,0);
        ctx.lineTo(140,0);
        ctx.stroke();

        //畫中心圓點
        ctx.fillStyle="red";
        ctx.arc(0,0,10,0,2*Math.PI)
        ctx.closePath();
        ctx.fill();

        //畫秒針圓圈頭
        ctx.strokeStyle="red";
        ctx.moveTo(160,0);
        ctx.arc(150,0,8,0,2*Math.PI);
        ctx.stroke();
        ctx.restore();

        // 畫clock的表盤
        ctx.beginPath();
        ctx.strokeStyle="blue";
        ctx.lineWidth=10;
        ctx.arc(0,0,174,0,Math.PI*2);
        ctx.stroke();

        ctx.restore();
        window.requestAnimationFrame(clock);
    };
    window.requestAnimationFrame(clock);
});

 

 

來自:http://www.cnblogs.com/beyond-utf-8/p/beyond-utf-8.html

 

 本文由用戶 LonaKXUR 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!