先來看一段正常的canvas畫圖語法:
程式碼如下:
程式碼如下:
程式碼如下:ctx.arc(centerX,centerY,radius,0,PI*2,true);
ctx.shadowColor = 'rgba(0,0,0,0.5)';
ctx.shadowBlur = "10" ;
ctx.fill();
ctx.beginPath();
ctx.shadowColor = 'rgba(0,0,0,0)';
ctx.moveTo(centerX-radius, centerY);
ctx.lineTo(centerX-radius,centerY - 50);
ctx.lineTo(centerX radius,centerY); // ctx.lineTo(centerX-radius,centerY);
ctx.fill();
ctx.beginPath();
ctx.fillStyle = 'rgba(255,0,0,1)' ;
ctx.arc(centerX,centerY-50,radius,0,PI*2,true);
所以,我也想用這種文法來進行canvas繪圖:
複製程式碼
程式碼如下:
ctx.moveTo(500,0).lineTo(500,500).strokeStyle('#f00').stroke();
有個辦法就是模擬一個context2d物件支援所有的原生context2d方法,但又支援鍊式。
不過,程式碼不能太多,多了就沒人喜歡用了。
下面就是完整的程式碼段,這個「類別」我取名為XtendCanvas(又是以X開頭的喲):
複製程式碼
程式碼如下:
// 讓canvas支援鍊式語法,來自十年燈
function XtendCanvas (canvas) {
<.> var ctx = canvas.getContext('2d'),
} else {
ctx[p] = args '';
}
return fnP;
這樣一來你就可以把所有操作都放在一句話裡,你也可以隨時中斷,做其他的事,然後繼續。
這段程式碼並不是對canvas的增強,只是單純的讓他支援鍊式語法了。但勝在程式碼少,可以嵌入任何JS函式庫中,在此我希望能得到你的一個「推薦」
程式碼中肯定有值得改進的地方,大家可以自行完善。但——吃水不忘挖井人,希望大家記得我,最重要的是思路,對吧?下面就是想法:
大家可以看到,程式碼中最長的部分,是那個保存方法名稱的陣列pro,核心程式碼反而很短。為什麼我要蓋這麼一個陣列呢?
本來我也想直接從CanvasRenderingContext2D繼承所有原生方法,但每個瀏覽器下面遍歷這個CanvasRenderingContext2D,結果都不一致。如果我把他們直接繼承,那麼當你想用chrome中的方法套在firefox裡執行,就會報錯。
所以我只是把CanvasRenderingContext2D中的通用的,無異議的方法與屬性名提取了出來,沒辦法,只有建一個固定的數組——大家可以自行決定往裡面添加你的方法。
方法與屬性提取出來了,接著就是把原生的方法加在我的新物件上。我建了一個叫fn的空函數,放置我的方法。
由於數組中的這些元素既有函數,也有屬性,所以我在循環中判斷了他是否是一個函數,如果是函數,就帶參數執行;不是函數——那麼就肯定是屬性了,就把參數賦給這個屬性。
這樣大家在碰到設定canvas屬性的時候,就不用中斷鏈了,直接把屬性值當參數傳進去就行了,比如:
ctx.strokeStyle('#f00')
最後,關鍵的關鍵,就是返回fn,這招是從jQuery學來的,是支援鍊式語法的關鍵。
這段中用到了匿名函數,閉包,原型,以及我以前文章講過的奇怪的for循環。
說起來好像挺簡單的,不過我實在是想了很久,希望對大家有用。
在寫程式碼的過程中,我發現chrome的做法很不錯,他有一串以set開頭的函數,如setStrokeColor,setLineCap等函數,給他們傳參數,就可以取代對應的strokeStyle和lineCap等屬性,也就是說,他的canvas裡面就全是函數而沒有屬性了那樣的話我就不用判斷是函數還是屬性了。但firefox裡面沒有這些,所以我還是只能用前面的想法。
我也把那一串set函數給放出來吧:
var bak = ['setTransform','setAlpha', 'setCompositeOperation', 'setLineWidth', 'setLineCap', 'setLineJoin', 'setMiterLimit', 'setMiterLimit' ','setShadow','setStrokeColor','setFillColor'];
他們的用處一看就懂。你也可以選擇一些加入前面程式碼的pro數組中。
最後,我很奇怪我的程式碼怎麼會沒有高亮了。 。 。如果你都看到最後了,那麼還是給個推薦吧,讓我也虛榮一把

本文解釋瞭如何使用&lt; audio&gt;元素,包括用於格式選擇的最佳實踐(MP3,OGG Vorbis),文件優化和JavaScript控件用於播放。 它強調使用多個音頻f

本文解釋瞭如何創建和驗證HTML5表格。 它詳細介紹了&gt;元素,輸入類型(文本,電子郵件,編號等)和屬性(必需,模式,最小,最大)。 HTML5的優勢比舊方法形成

本文討論了使用HTML5頁面可見性API來檢測頁面可見性,提高用戶體驗並優化資源使用情況。關鍵方麵包括暫停媒體,減少CPU負載以及基於可見性變化管理分析。

本文討論了使用視口元標記來控制移動設備上的頁面縮放,重點是寬度和初始尺度之類的設置,以獲得最佳響應和性能。

本文討論了使用GeOlocation API管理用戶位置隱私和權限,並強調要求權限,確保數據安全性並遵守隱私法律的最佳實踐。

本文使用JavaScript詳細介紹了創建Interactive HTML5遊戲。 它涵蓋了遊戲設計,HTML結構,CSS樣式,JavaScript邏輯(包括事件處理和動畫)以及音頻集成。 必需的JavaScript庫(Phaser,Pi

本文介紹瞭如何使用HTML5拖放API來創建交互式用戶界面,詳細介紹了使元素可拖動的步驟,處理關鍵事件並通過自定義反饋來增強用戶體驗。它還討論了一個常見的陷阱

本文解釋了HTML5 Websockets API,用於實時雙向客戶服務器通信。 它詳細詳細介紹了客戶端(JavaScript)和服務器端(Python/Flask)的實現,以應對可伸縮性,狀態管理,一個挑戰


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3漢化版
中文版,非常好用

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境