摘要:有了,我們就再也不需要了,直接使用完成繪制。繪制原點(diǎn)開始時(shí)鐘開始時(shí)鐘我們將當(dāng)前時(shí)間繪制到始終上面即可需要注意的是,在繪制之前需要將之前繪制的東西清除掉。
Canvas是HTML5新增的組件,它就像一塊幕布,可以用JavaScript在上面繪制各種圖表、動(dòng)畫等。
沒(méi)有Canvas的年代,繪圖只能借助Flash插件實(shí)現(xiàn),頁(yè)面不得不用JavaScript和Flash進(jìn)行交互。有了Canvas,我們就再也不需要Flash了,直接使用JavaScript完成繪制。
在html源碼中只要像普通標(biāo)簽?zāi)菢邮褂眉纯桑热缦旅娴氖纠?,但是在一些老舊的瀏覽器在中是不支持canvas的,因此我們常在canvas標(biāo)簽中提示用戶,具體代碼如下所示。
或者使用JS腳本來(lái)進(jìn)行檢測(cè),使用JavaScript代碼檢測(cè)是否支持canvas的代碼示例如下:
var myCanvas = document.getElementById("myCanvas");
if (myCanvas.getContext) {
myCanvas.log("你的瀏覽器支持Canvas!");
} else {
myCanvas.log("你的瀏覽器不支持Canvas!");
}
由于繪制canvas通常代碼需要比較多,我們常常使用引用js的方式來(lái)繪制canvas,這里我們也是引入js文件來(lái)操作canvas,HTML源碼如下所示
學(xué)習(xí)Canvas繪制始終效果
根據(jù)實(shí)際的需要?jiǎng)?chuàng)建js文件,這里我引入的地址是js/canvas.js,因此需要和HTML源碼文件同級(jí)下創(chuàng)建js文件夾,然后再js文件夾中創(chuàng)建canvas.js文件。
繪制效果如下
這里保持一些全局變量,方便后面使用的
//獲取canvas的上下文環(huán)境
var myCanvas = document.getElementById("myCanvas")
var ctx = myCanvas.getContext("2d")
//獲取canvas的寬度和高度
var canvasWidth = myCanvas.width
var canvasHeight = myCanvas.height
我們首先繪制背景,分析背景可以看到,他是由一個(gè)大的黑色與圓圈包裹,里面有一個(gè)灰色的略小的圓圈,在灰色圓圈的周圍均勻分布著時(shí)鐘點(diǎn),這些時(shí)鐘點(diǎn)每逢5的倍數(shù)的時(shí)候突出顯示,否則就是灰色顯示,這就是我們的需求,具體注釋在代碼中可以詳細(xì)看到。
//開始繪制背景
function drawBackground() {
//未防止當(dāng)前畫布環(huán)境被破壞,因此我們保存當(dāng)前的繪制環(huán)境
ctx.save()
//開始繪制路徑
ctx.beginPath()
//配置繪制顏色,我們首先繪制的是黑色圓圈,因此我們配置為黑色
ctx.strokeStyle = "#000000"
//繪制寬度為6個(gè)像素
ctx.lineWidth = 6
//開始繪制圓,圓心未知是寬和高的一半,半徑是寬度的一半減去圓圈的寬度
//這里最后的兩個(gè)參數(shù)需要注意
//指的是繪制圓圈的起點(diǎn)和繪制的弧度
//我們從0點(diǎn)開始繪制然后繪制2*PI個(gè)弧度,也就是一個(gè)正圓
//這里的點(diǎn)是從x軸正方向開始的
ctx.arc(canvasWidth/2,canvasHeight/2,canvasHeight/2-3,0,2*Math.PI)
//配置完成,開始繪制
ctx.stroke()
//同樣的需求開始繪制灰色的圓圈
ctx.beginPath()
ctx.strokeStyle = "#CCCCCC"
ctx.lineWidth = 1
ctx.arc(canvasWidth/2,canvasHeight/2,(canvasWidth/2-15),0,2*Math.PI)
ctx.stroke()
//將原點(diǎn)從左上角0,0移動(dòng)到中心位置
ctx.translate(canvasWidth/2,canvasHeight/2)
//需要現(xiàn)實(shí)的數(shù)字
//這是可以看到,數(shù)字是從3開始的,也驗(yàn)證了我們的之前說(shuō)的繪制從x軸正方向開始
//在時(shí)鐘界面x軸正方向就是3點(diǎn)鐘
var colorNumber = [3,4,5,6,7,8,9,10,11,12,1,2]
//配置字體和對(duì)齊方向
ctx.font="25px Arial";
ctx.textAlign = "center"
ctx.textBaseline = "middle"
//循環(huán)遍歷,開始繪制數(shù)字
for(var i = 0;i
繪制時(shí)針、分針以及秒針的理念是先繪制0時(shí)刻的樣子,然后旋轉(zhuǎn)畫布一定的弧度,從而達(dá)到轉(zhuǎn)動(dòng)的效果。
//繪制時(shí)針
function drawHours(hours,minte) {
//保存環(huán)境
ctx.save()
//計(jì)算時(shí)鐘角度和偏離的角度
var rad = 2 * Math.PI / 12 * hours;
var rad2 = 2 * Math.PI / 12 /60 * minte;
//旋轉(zhuǎn)畫布
ctx.rotate(rad+rad2)
ctx.beginPath();
//配置繪制效果
ctx.lineWidth = 6
ctx.strokeStyle = "#000"
//線的兩端保持圓角
ctx.lineCap = "round"
//將繪制點(diǎn)移動(dòng)到中心原點(diǎn)以下10個(gè)像素點(diǎn)
ctx.moveTo(0,10);
//繪制一個(gè)線
ctx.lineTo(0,-(canvasWidth-150)/2)
ctx.stroke()
//恢復(fù)之前保存的環(huán)境
ctx.restore()
}
繪制分針和秒針的方法和時(shí)針一樣,僅僅是繪制的顏色和寬度不一樣,這里不再詳細(xì)贅述.
//繪制分針
function drawMinute(minute) {
ctx.save()
var rad = 2 * Math.PI / 60 * minute;
ctx.rotate(rad)
ctx.beginPath();
ctx.lineWidth = 3
ctx.strokeStyle = "#000"
ctx.lineCap = "round"
ctx.moveTo(0,10);
ctx.lineTo(0,-(canvasWidth-100)/2)
ctx.stroke()
ctx.restore()
}
//繪制秒針
function drawSecond(second) {
ctx.save()
var rad = 2 * Math.PI / 60 * second;
ctx.rotate(rad)
ctx.beginPath();
ctx.lineWidth = 3
ctx.strokeStyle = "#f00"
ctx.lineCap = "round"
ctx.moveTo(0,20);
ctx.lineTo(0,-(canvasWidth-40)/2)
ctx.stroke()
ctx.restore()
}
時(shí)針、分針和秒針的中心集合點(diǎn)出有白點(diǎn),類似某個(gè)機(jī)械元件,將三個(gè)針鎖住,我們只要繪制原點(diǎn)即可。
//繪制原點(diǎn)
function drawPoint() {
ctx.beginPath()
ctx.fillStyle ="#FFF"
ctx.arc(0,0,3,0,2*Math.PI)
ctx.fill()
}
我們將當(dāng)前時(shí)間繪制到始終上面即可,需要注意的是,在繪制之前需要將之前繪制的東西清除掉。
//開始啟動(dòng)時(shí)針
function startColor() {
//清除畫布內(nèi)容
ctx.clearRect(0,0,canvasWidth,canvasHeight)
var date = new Date()
var hour = date.getHours()
var minute = date.getMinutes()
var second = date.getSeconds()
drawBackground()
drawHours(hour,minute)
drawMinute(minute)
drawSecond(second)
drawPoint()
ctx.restore()
}
要想動(dòng)態(tài)的讓時(shí)鐘跑起來(lái),我們需要設(shè)置一個(gè)定時(shí)執(zhí)行器,每秒更新一次,這樣始終就完全動(dòng)起來(lái)了
setInterval(startColor,1000)
這個(gè)時(shí)鐘的寬度和高度已經(jīng)寫死了,在動(dòng)態(tài)調(diào)節(jié)的過(guò)程中,會(huì)出現(xiàn)錯(cuò)位等問(wèn)題,下一篇將修正這個(gè)問(wèn)題,敬請(qǐng)期待。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/1223.html
摘要:最近在學(xué),然后根據(jù)上的例子做了個(gè)動(dòng)畫時(shí)鐘為什么要造個(gè)輪子,因?yàn)槌?。。首先,找一張時(shí)鐘的圖片,就是下面這張了。那么我們就用循環(huán)來(lái)畫出小時(shí)的刻度。這個(gè)就是我們的繪制時(shí)鐘的函數(shù)。到這里,動(dòng)畫時(shí)鐘就了效果圖如下演示地址地址 最近在學(xué)canvas,然后根據(jù)MDN上的例子做了個(gè)動(dòng)畫時(shí)鐘(為什么要造個(gè)輪子,因?yàn)槌?。。?這是MDN上的例子,怎么說(shuō)呢,比較復(fù)古吧。 showImg(https://se...
閱讀 1091·2021-11-24 09:39
閱讀 2796·2021-09-26 09:55
閱讀 18334·2021-08-23 09:47
閱讀 3663·2019-08-30 15:52
閱讀 917·2019-08-29 13:49
閱讀 1077·2019-08-23 18:00
閱讀 909·2019-08-23 16:42
閱讀 1736·2019-08-23 14:28