使用canvas繪制時鐘

使用canvas繪制時鐘

  ?什么使canvas呢?HTML5 <canvas> 元素用于圖形的繪制,通過腳本 (通常是JavaScript)來完成。<canvas> 標簽只是圖形容器,所以我們必須使用腳本來繪制圖形。通過它可以繪制路徑,盒、圓、字符以及添加圖像等等。

  常用的API

? ? ?這篇博文,我將通過html5中的canvas元素繪制一個走動的時鐘。

  html代碼如下:

		<canvas id="clock" width="200" height="200" style="border:1px solid #ff0000;"></canvas>

  其中id這個屬性是必須要添加的,因為后面在JavaScript腳本中,我們會通過它來獲得這個元素。 注意到width和height都是沒有單位的,默認為px。 且<canvas>元素是沒有內容的,當然,也可以寫一些內容,對于不支持canvas標簽的瀏覽器來說,它會顯示其中的內容,而對于支持canvas標簽的瀏覽器而言,其中的內容會被自動忽略。故其效果和<noscript>標簽是一樣的。我們還可以通過style屬性來為canvas畫布添加一個邊框,這樣就可以直接在頁面中看到效果了。

  注意:canvas元素默認是inline。

  JavaScript代碼如下:

window.οnlοad=function(){var clock=document.getElementById("clock").getContext('2d');//通過獲取canvas元素獲取2d上下文var width=clock.canvas.width;//得到畫布的寬度var height=clock.canvas.height;//得到花布的高度var r=width/2;//得到將要畫的時鐘的半徑var prop=width/150;//在此保留比例,以便于在更換畫布大小時調節function outline(){clock.save();//保存當前狀態clock.translate(r,r);//將原點移動到(r,r)處clock.beginPath();//每個函數內部都要有beginPath()方法clock.lineWidth=3*prop;//通過lineWidth來設置劃線的寬度,注意這里沒有單位clock.arc(0,0,r-clock.lineWidth/2,0,2*Math.PI,false);clock.stroke();//繪制路徑var scaleNumbers=[3,4,5,6,7,8,9,10,11,12,1,2];clock.font=12*prop+"px Arial";//通過font來設置字體的大小。關鍵:一定單位px,且后面一定要有字體樣式clock.textAlign="center";//設置位水平居中clock.textBaseline="middle";//設置位垂直居中	scaleNumbers.forEach(function(number,i){//遍歷數組var rad=2*Math.PI/12*i;var x=Math.cos(rad)*(r-15*prop);var y=Math.sin(rad)*(r-15*prop);clock.fillText(number,x,y);//在x y處繪制number});for(var i=0;i<=60;i++){var rad=2*Math.PI/60*i;var x=Math.cos(rad)*(r-7*prop);var y=Math.sin(rad)*(r-7*prop);clock.beginPath();if(i%5===0){clock.fillStyle="red";//填充的顏色clock.arc(x,y,1*prop,0,2*Math.PI,false);}else{clock.fillStyle="black";clock.arc(x,y,1*prop,0,2*Math.PI,false);}clock.fill();}}function hours(hour,minute){clock.save();//一定要先保存clock.beginPath();var rad=2*Math.PI/12*hour;var minute_rad=2*Math.PI/12/60*minute;clock.rotate(rad+minute_rad);clock.strokeStyle="blue";clock.lineCap="round";clock.lineWidth=5*prop;clock.moveTo(0,2*prop);clock.lineTo(0,-r+40*prop);clock.stroke();clock.restore();//恢復}function minutes(minute){clock.save();clock.beginPath();clock.strokeStyle="orange";//設置路徑的顏色clock.lineWidth=4*prop;clock.lineCap="round";//設置線的樣式var rad=2*Math.PI/60*minute;clock.rotate(rad);//旋轉畫布clock.moveTo(0,5*prop);//將“畫筆”移動到(這里沒有繪畫)clock.lineTo(0,-r+25*prop);clock.stroke();clock.restore();}function seconds(second){clock.save();clock.beginPath();clock.fillStyle="red";var rad=2*Math.PI/60*second;clock.rotate(rad);clock.moveTo(-2*prop,5*prop);clock.lineTo(2*prop,5*prop);clock.lineTo(1*prop,-r+18*prop);clock.lineTo(3*prop,-r+18*prop);clock.lineTo(0,-r+10*prop);clock.lineTo(-3*prop,-r+18*prop);clock.lineTo(-1*prop,-r+18*prop);clock.fill();clock.restore();}function middle_dot(){clock.beginPath();clock.fillStyle="white";clock.arc(0,0,5*prop,0,2*Math.PI,false);clock.fill();}function all(){clock.clearRect(0,0,width,height);outline();middle_dot();var now=new Date();//通過Date對象獲取時間var hour=now.getHours();//獲取當前小時數var minute=now.getMinutes();var second=now.getSeconds();hours(hour,minute);minutes(minute);seconds(second);clock.restore();}all();setInterval(all,1000);//使用定時器不斷更新時間};

  這樣,一個canvas繪制的時鐘就完成了。看看最后的效果圖吧:

  

轉載于:https://www.cnblogs.com/zhuzhenwei918/p/6058768.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394687.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394687.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394687.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Visual Studio 2017創建XAML文件

Visual Studio 2017創建XAML文件在Visual Stuido 2015中&#xff0c;在已經創建好的項目中添加XAML文件&#xff0c;只要右擊項目&#xff0c;單擊“添加”|“新建項”命令&#xff0c;然后從“添加新項”對話框中&#xff0c;選擇“Cross-Platform”|“Forms Xaml Page”選項即…

android 安裝assets中的apk,如何安裝assets下apk,附源碼(原創)

publicstaticvoidInstall(Context ctx, String strLocalFile) {Intent intentInstallnewIntent();String apkPath"/data/data/"ctx.getPackageName()"/files";String apkName"yuan.apk";File filenewFile(apkPath, apkName);try{//assets下對于超…

FtpWebRequest.UsePassive屬性:設置FTP工作模式

默認值&#xff1a;true&#xff0c;被動模式 PASV&#xff08;被動&#xff09;方式的連接過程是&#xff1a;客戶端向服務器的FTP端口&#xff08;默認是21&#xff09;發送連接請求&#xff0c;服務器接受連接&#xff0c;建立一條命令鏈路。 當需要傳送數據時&#xff0c; …

angular面試題及答案_關于最流行的Angular問題的StackOverflow上的48個答案

angular面試題及答案by Shlomi Levi通過Shlomi Levi 關于最流行的Angular問題的StackOverflow上的48個答案 (48 answers on StackOverflow to the most popular Angular questions) I gathered the most common questions and answers from Stackoverflow. These questions we…

c++分治法求最大最小值實現_最優化計算與matlab實現(12)——非線性最小二乘優化問題——G-N法...

參考資料《精通MATLAB最優化計算&#xff08;第二版&#xff09;》編程工具Matlab 2019a目錄石中居士&#xff1a;最優化計算與Matlab實現——目錄?zhuanlan.zhihu.com非線性最小二乘優化問題非線性最小二乘優化也叫無約束極小平方和函數問題&#xff0c;它是如下無約束極小問…

win7 IIS7環境下部署PHP 7.0

最近在本機電腦win7 II7環境下部署PHP 7.0遇到一些問題&#xff0c;將之記錄下來 簡要步驟如下&#xff1a; 1、到php官網下載php&#xff0c;由于是IIS環境要下載非線程安全的版本&#xff0c;我下載的是7.0.13 2、解壓到本地文件目錄下 3、通過控制臺進入到php文件目錄&#…

《Oracle高性能自動化運維》一一3.3 Redo產生場景

3.3 Redo產生場景我們知道&#xff0c;Oracle Redo是以條目&#xff08;Redo Entries/Records&#xff09;的形式記錄數據庫的所有更改操作&#xff08;OP&#xff09;。更改操作主要包括&#xff1a;數據庫物理文件更改&#xff1a;主要指的是數據庫物理文件的增減等操作&…

智能算法(GA、DBO等)求解零空閑流水車間調度問題(NIFSP)

先做一個聲明&#xff1a;文章是由我的個人公眾號中的推送直接復制粘貼而來&#xff0c;因此對智能優化算法感興趣的朋友&#xff0c;可關注我的個人公眾號&#xff1a;啟發式算法討論。我會不定期在公眾號里分享不同的智能優化算法&#xff0c;經典的&#xff0c;或者是近幾年…

《構建之法》讀后感 二

個人感受部分&#xff1a; 01. 過去的我對自己的職業沒有一個規劃&#xff0c;認為讀大學就是拿畢業證&#xff0c;至于以后找到什么樣的工作從來沒有考慮過。在拿到一個軟件作業時&#xff0c;總是在設計階段就把它想得特別完美&#xff0c;想讓他沒有任何出錯的做出來&#x…

android 簡單實現圓角,Android 實現圓角圖片的簡單實例

Android 實現圓角圖片的簡單實例實現效果圖&#xff1a;本來想在網上找個圓角的例子看一看&#xff0c;不盡人意啊&#xff0c;基本都是官方的Demo的那張原理圖&#xff0c;稍后會貼出。于是自己自定義了個View&#xff0c;實現圖片的圓角以及圓形效果。效果圖&#xff1a;Andr…

zookeeper介紹及集群的搭建(利用虛擬機)

ZooKeeper ?   ZooKeeper是一個分布式的&#xff0c;開放源碼&#xff08;apache&#xff09;的分布式應用程序協調服務&#xff0c;是Google的Chubby一個開源的實現&#xff0c;是Hadoop和Hbase、dubbox、kafka的重要組件。它主要用來解決分布式集群中應用系統的一致性問題…

pythondict初始化_利用defaultdict對字典進行全局初始化。

通常我們在操作字典時&#xff0c;如果讀取的鍵未被初始化&#xff0c;則會拋出KeyError的錯誤&#xff0c;這個是我們都很熟悉的。那么一般的解決方式是使用異常處理或者是調用字典的get方法來避免出現這個異常。 可以看到&#xff0c;這兩種寫法都比較繁瑣&#xff0c;第二種…

標準庫類型String

定義和初始化string對象 初始化string對象方式 string s1 默認初始化&#xff0c;s1是一個空串 string s2(s1) s2是s1的副本 string s2 s1 等價于s2(s1), s2是s1的副本 string s3("value") s3是字面值"value"的副本&#xff0c;除了字面值最后的那個…

輕量級數據庫中間件利器Sharding-JDBC深度解析(有彩蛋)

講師介紹張亮 當當架構部總監 負責分布式中間件和私有云平臺建設 目前主導開源項目&#xff1a;Elastic-Job及Sharding-JDBC 主題簡介&#xff1a; 1、關系型數據庫中間件核心功能介紹 2、Sharding-JDBC架構及內核解析 3、Sharding-JDBC未來展望 一、關系型數據庫中間件核心功…

python字典嵌套字典的情況下獲取某個key的value

最近在用python寫接口的測試程序&#xff0c;期間用到解析字典獲取某個key的value&#xff0c;由于多個接口返回的字典格式不是固定的并存在多層嵌套的情況。在字典的方法中也沒有找到可直接達到目的的方法(也可能是我對字典的方法了解的不深的緣故)&#xff0c;于是自己寫了個…

系統在此應用程序堆棧溢出_從部署我的第一個完整堆棧Web應用程序中學到的經驗教訓...

系統在此應用程序堆棧溢出by Will Abramson威爾艾布拉姆森(Will Abramson) 從部署我的第一個完整堆棧Web應用程序中學到的經驗教訓 (Lessons learned from deploying my first full-stack web application) I recently achieved one of my long-term goals: deploying my firs…

const 常量_條款03:盡可能使用const

const 允許你指定一個語義約束&#xff08;也就是指定一個“不該被改動”的對象&#xff09;&#xff0c;而編譯器會強制實施這項約束。1、const指針如果關鍵字const出現在星號左邊&#xff0c;表示被指物是常量&#xff1b;如果出現在星號右邊&#xff0c;表示指針自身是常量&…

javascript高級程序設計---js事件思維導圖

繪制思維軟件與平時用的筆記&#xff0c;以及導出功能&#xff0c;這三個問題綜合起來&#xff0c;于是我把思維導圖分開畫 1、js事件的基本概念 2、js事件的事件處理程序 3、js事件的事件對象 轉載于:https://www.cnblogs.com/Jamie1032797633/p/10567419.html

jq挑戰30天——打字機效果+小程序

<!doctype html><html><head><meta charset"utf-8"><title>基于jQuery實現的打字機效果-jq22.com</title><script src"http://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script><style></…

和 Thrift 的一場美麗邂逅

一. 與 Thrift 的初識 也許大多數人接觸 Thrift 是從序列化開始的。每次搜索 “java序列化” “方式”、“對比” 或 “性能” 等關鍵字時&#xff0c;搜索引擎總是會返回一大堆有關各種序列化方式的使用方法或者性能對比的結果給你&#xff0c;而其中必定少不了 Thrift&#…