您當前的位置:首頁 > 攝影

教你實現一個樸實的Canvas時鐘效果

作者:由 華為雲開發者聯盟 發表于 攝影時間:2022-10-21

摘要:

今天教大家寫一個canvas的時鐘案例,效果可能看起來比較簡單,沒有那些花裡胡哨的。

本文分享自華為雲社群《如何實現一個樸實無華的Canvas時鐘效果》,作者: 北極光之夜。。

一.先看效果:

今天寫一個canvas的時鐘案例。效果可能看起來比較簡單,沒有那些花裡胡哨的,不過,它涉及的canvas知識點是比較多的,初學canvas那是必定要會的。下面手把手帶你快速實現~

教你實現一個樸實的Canvas時鐘效果

二。實現步驟(原始碼在最後):

1。 設定基本的標籤與樣式:

* {

margin: 0;

padding: 0;

box-sizing: border-box;

}

body {

height: 100vh;

display: flex;

justify-content: center;

align-items: center;

background-color: rgb(204, 204, 204);

}

。clock {

width: 300px;

height: 300px;

background-color: rgb(15, 15, 15);

border-radius: 50px;

}

2。 開始js程式碼實現,下面為了易於理解,所以一個功能封裝一個函式:

var canvas = document。getElementById(“canvas”);

var ctx = canvas。getContext(“2d”);

3。 先繪製鐘的整體白色底盤:

同時為了後期將旋轉點為。clock的中心的,所以將translate偏移一半的距離。

function drawPanel() {

ctx。translate(150, 150);

// 開始繪製

ctx。beginPath();

// 畫一個圓

ctx。arc(0, 0, 130, 0, 2 * Math。PI);

ctx。fillStyle = “white”;

ctx。fill();

}

4。繪製時鐘的12位數字:

可知,一個圓上它的x座標為:R * cos(它的角度), y座標為:R *sin(它的角度)。

同時,因為Math。cos()與Math。sin()裡是計算弧度的,所以要轉換。公式:弧度 = 角度 * π / 180

function hourNum() {

// 存放12個數字

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];

ctx。beginPath();

// 數字的基本樣式

ctx。font = “30px fangsong”;

ctx。textAlign = “center”;

ctx。textBaseline = “middle”;

ctx。fillStyle = “black”;

for (var i = 0; i < arr。length; i++) {

ctx。fillText(

arr[i],

108 * Math。cos(((i * 30 - 60) * Math。PI) / 180),

108 * Math。sin(((i * 30 - 60) * Math。PI) / 180)

);

}

}

5。 繪製時鐘中心的圓點:

一個灰圓覆蓋一個稍大的黑圓。

function centerDot() {

ctx。beginPath();

ctx。arc(0, 0, 8, 0, 2 * Math。PI);

ctx。fill();

ctx。beginPath();

ctx。fillStyle = “gray”;

ctx。arc(0, 0, 5, 0, 2 * Math。PI);

ctx。fill();

}

6。繪製時針:

假設引數 hours 與 minutes 為傳入的當前的時間的小時數與分鐘數。

function hourHand(hours, minutes) {

// 應該旋轉的角度,預設時鐘為指向12點方向。

var radius =

((2 * Math。PI) / 12) * hours + (((1 / 6) * Math。PI) / 60) * minutes;

// 儲存當前狀態,為了旋轉後能回到當初狀態。

ctx。save();

ctx。beginPath();

// 針的寬度

ctx。lineWidth = 5;

// 針頭為圓角

ctx。lineCap = “round”;

ctx。strokeStyle = “black”;

// 旋轉

ctx。rotate(radius);

// 畫一條線表示時鐘

ctx。moveTo(0, 0);

ctx。lineTo(0, -50);

ctx。stroke();

// 回到儲存的狀態

ctx。restore();

}

7。 同理,繪製分針:

function minuteHand(minutes) {

2 * Math。PI;

var radius = ((2 * Math。PI) / 60) * minutes;

ctx。save();

ctx。beginPath();

ctx。lineWidth = 3;

ctx。lineCap = “round”;

ctx。strokeStyle = “black”;

ctx。rotate(radius);

ctx。moveTo(0, 0);

ctx。lineTo(0, -70);

ctx。stroke();

ctx。restore();

}

8。 同理,繪製秒針:

function secondHand(seconds) {

var radius = ((2 * Math。PI) / 60) * seconds;

ctx。save();

ctx。beginPath();

ctx。lineWidth = 1;

ctx。lineCap = “round”;

ctx。strokeStyle = “red”;

ctx。rotate(radius);

ctx。moveTo(0, 0);

ctx。lineTo(0, -90);

ctx。stroke();

ctx。restore();

}

9。 封裝一個函式獲取當前時間:

同時函式內部呼叫全部繪製的函式。實現繪製一個完整的時鐘。

function update() {

var time = new Date();

var hours = time。getHours();

var minutes = time。getMinutes();

var seconds = time。getSeconds();

// 儲存canvas狀態,因為繪製底盤時它偏移了

ctx。save();

drawPanel();

hourNum();

secondHand(seconds);

minuteHand(minutes);

hourHand(hours, minutes);

centerDot();

// 恢復canvas狀態

ctx。restore();

}

update();

10。 開啟定時器,時鐘運轉:

setInterval(() => {

ctx。clearRect(0, 0, canvas。width, canvas。height);

update();

}, 1000);

三。總結:

上面就是全部內容了,實現並不難,就是對canvas提供的一些方法進行合理的使用,拿來練手是很不錯的。原始碼在我的gitee倉庫直接去下載或者複製獲取 :https://gitee。com/aurora-in-winter/blog。git

點選關注,第一時間瞭解華為雲新鮮技術~

標簽: ctx  math  Canvas  var  pi