Canvas繪圖——2d表

初學(xué)JavaScript饿悬,用Canvas畫一個(gè)表(源代碼)。主要用到昨天學(xué)的間歇調(diào)用(setInterval)。

方法和屬性介紹

  • context.beginPath()煞茫、context.closePath():開始路徑和結(jié)束路徑。通俗講就像紙上畫畫的落筆和提筆摄凡。
  • context.strokeStyle续徽、context.fillStyle:設(shè)置邊框顏色和填充顏色。
  • context.arc(x,y,radius,startAngle,endAngle,anticlockwise):畫一個(gè)圓亲澡。
  • context.rotate(angle):旋轉(zhuǎn)钦扭,弧度。
  • context.translate(x, y):將(x床绪,y)設(shè)為原點(diǎn)坐標(biāo)客情,即以(x,y)為基準(zhǔn)點(diǎn)癞己。
  • context.moveTo(x,y)裹匙、 context.lineTo(x,y):將筆移動(dòng)到(x,y)末秃,畫直線到(x概页,y)。
  • context.stroke()练慕、context.fill():開始繪制邊框和繪制顏色惰匙。
    上述方法和屬性加粗的是必用的,其余的可選铃将,根據(jù)需求看需要畫什么則用什么项鬼。
  • setInterval = function(code,delay,arguments) {}:這個(gè)函數(shù)代表每隔幾秒運(yùn)行一次,見JavaScript概覽劲阎。

代碼解析

HTML中:

......
<canvas id="c" width="200" height="200">A drawing of something.</canvas>
<script src="js/clock2d.js"></script>
...... 

clock2d.js中:
聲明變量绘盟。

var canvas = document.getElementById("c");
var context = canvas.getContext("2d");
var width = canvas.width;
var height = canvas.height;
var r = width / 2;

寫間歇調(diào)用函數(shù)。表盤和刻度是靜態(tài)的,指針是動(dòng)態(tài)的龄毡,每秒需要刷新重畫吠卷,所以代碼應(yīng)該是這樣:

setInterval(function () {
    context.clearRect(0, 0, width, height); // 清空畫布所有內(nèi)容
    context.save(); 
    context.translate(width / 2, height / 2); //將畫布中心設(shè)為原點(diǎn)
    drawStatic(); 
    drawDynamic();
    context.restore();
}, 1000);

寫繪制靜態(tài)表盤函數(shù)。由于內(nèi)表盤和外表盤還有刻度都是圓沦零,所以可以最后重構(gòu)成一個(gè)函數(shù)祭隔。

function drawStatic() {
    // 外圓
    drawCircle(1, "#000000", "rgba(0, 0, 0, 0)", 0, 0, r * 0.9);
    // 內(nèi)圓
    drawCircle(1, "#000000", "rgba(0, 0, 0, 0)", 0, 0, r * 0.87);
    // 刻度點(diǎn)12
    drawCircle(1, "#000000", "#000000", 0, -r * 0.80, 2);
    // 刻度點(diǎn)6
    drawCircle(1, "#000000", "#000000", 0, r * 0.80, 2);
    // 刻度點(diǎn)3
    drawCircle(1, "#000000", "#000000", r * 0.80, 0, 2);
    // 刻度點(diǎn)9
    drawCircle(1, "#000000", "#000000", -r * 0.80, 0, 2);
}

function drawCircle(lineWidth, strokeColor, fillColor, x, y, radius) {
    context.beginPath();
    context.lineWidth = lineWidth;
    context.strokeStyle = strokeColor;
    context.fillStyle = fillColor;
    context.arc(x, y, radius, 0, 2 * Math.PI, false);
    context.stroke();
    context.fill();
    context.closePath();
}

繪制指針。繪制時(shí)針的位置路操,需要知道是幾小時(shí)幾分疾渴,最終都轉(zhuǎn)換成小時(shí),然后計(jì)算相應(yīng)的旋轉(zhuǎn)弧度屯仗,繪制分針的位置搞坝,需要知道幾分幾秒,最終都轉(zhuǎn)換成分針魁袜,計(jì)算相應(yīng)的弧度瞄沙,所以也可以重構(gòu)成同一個(gè)函數(shù),只是最終轉(zhuǎn)換的和分度值以及對(duì)指針的外觀設(shè)置不同慌核。

function drawDynamic() {
    var now = new Date();
    // 時(shí)針
    drawNeedle(now.getHours(), now.getMinutes(), 12, r * 0.5, 3, "#000000");
    // 分針
    drawNeedle(now.getMinutes(), now.getSeconds(), 60, r * 0.65, 2, "#000000");
    // 秒針
    drawNeedle(now.getSeconds(), 0, 60, r * 0.7, 1, "#ff0a11");
}

function drawNeedle(final, rest, scale, length, width, color) {
    final = final + rest / 60;
    context.save();
    context.beginPath();
    context.rotate(2 * Math.PI / scale * final);
    context.lineWidth = width;
    context.strokeStyle = color;
    context.moveTo(0, 0);
    context.lineTo(0, -length);
    context.stroke();
    context.closePath();
    context.restore();
}

OK,鐘表繪制完成申尼。

表.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末垮卓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子师幕,更是在濱河造成了極大的恐慌粟按,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霹粥,死亡現(xiàn)場離奇詭異灭将,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)后控,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門庙曙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浩淘,你說我怎么就攤上這事捌朴。” “怎么了张抄?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵砂蔽,是天一觀的道長。 經(jīng)常有香客問我署惯,道長左驾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮诡右,結(jié)果婚禮上安岂,老公的妹妹穿的比我還像新娘。我一直安慰自己稻爬,他們只是感情好嗜闻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桅锄,像睡著了一般琉雳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上友瘤,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天翠肘,我揣著相機(jī)與錄音,去河邊找鬼辫秧。 笑死束倍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盟戏。 我是一名探鬼主播绪妹,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柿究!你這毒婦竟也來了邮旷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蝇摸,失蹤者是張志新(化名)和其女友劉穎婶肩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體貌夕,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡律歼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啡专。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片险毁。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖们童,靈堂內(nèi)的尸體忽然破棺而出辱揭,到底是詐尸還是另有隱情,我是刑警寧澤病附,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布问窃,位于F島的核電站,受9級(jí)特大地震影響完沪,放射性物質(zhì)發(fā)生泄漏域庇。R本人自食惡果不足惜嵌戈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望听皿。 院中可真熱鬧熟呛,春花似錦、人聲如沸尉姨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽又厉。三九已至九府,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間覆致,已是汗流浹背侄旬。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留煌妈,地道東北人儡羔。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像璧诵,于是被迫代替她去往敵國和親汰蜘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一:canvas簡介 1.1什么是canvas之宿? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,683評(píng)論 2 32
  • 本章內(nèi)容 理解 元素 繪制簡單的 2D 圖形 使用 WebGL 繪制 3D 圖形 這個(gè)元素負(fù)責(zé)在頁面中設(shè)定一個(gè)區(qū)域...
    悶油瓶小張閱讀 849評(píng)論 0 0
  • 熟悉html5的程序員們肯定都知道 元素族操,該元素是用來在頁面中規(guī)定一塊區(qū)域,然后由js在該區(qū)域內(nèi)繪制圖形澈缺。canv...
    米幾V閱讀 2,162評(píng)論 1 5
  • --繪圖與濾鏡全面解析 概述 在iOS中可以很容易的開發(fā)出絢麗的界面效果,一方面得益于成功系統(tǒng)的設(shè)計(jì)炕婶,另一方面得益...
    韓七夏閱讀 2,727評(píng)論 2 10
  • 剛過去的520姐赡,本來就是秀恩愛沒下線的社交圈里更加是寸草不生了,各種的禮物柠掂,大捧的玫瑰花项滑,名貴的包包,涯贞,枪狂,,看各種...
    王大帥123321閱讀 223評(píng)論 0 0