摘要:另外這里循環中用到了的旋轉效果,所以我們可以很輕易的畫出條有角度的線。效果見文章開頭的效果展示鏈接
效果展示
理論基礎——“常見的canvas優化——模糊問題、旋轉效果”
1、封裝畫線函數
function drawLine(ctx,x1,y1,x2,y2,color){ ctx.save(); ctx.beginPath(); ctx.strokeStyle = color; ctx.lineTo(x1, y1); ctx.lineTo(x2, y2); ctx.stroke(); ctx.restore(); }
2、畫雪花的六條線
function canvasSingleSnow(snowSize){ var singleSnow = document.createElement("canvas"); var ctxSingle = singleSnow.getContext("2d"); singleSnow.setAttribute("width", snowSize * 2); singleSnow.setAttribute("height", snowSize * 2); ctxSingle.translate(snowSize, snowSize);//定位原點到畫布中心 for(var i = 0; i < 6; i++){//畫六條線 ctxSingle.save(); ctxSingle.rotate(Math.PI*2 * i/6); drawLine(ctxSingle, 0, 0, snowSize, 0,"#656565"); ctxSingle.restore(); } return singleSnow; }
首先這里用到了離屏canvas,我們通過傳參的方式確定離屏canvas的尺寸,是為了盡可能避免canvas圖案縮放導致的顯示效果問題。
另外這里for循環中用到了canvas的旋轉效果,所以我們可以很輕易的畫出6條有角度的線。效果如下圖所示
3、畫出完整的雪花
function drawCanvasSnow(centerSnow){ var canvasSnow = document.createElement("canvas"); var ctxSnow = canvasSnow.getContext("2d"); canvasSnow.setAttribute("width", centerSnow * 2); canvasSnow.setAttribute("height", centerSnow * 2); //畫一個大雪花 var bigSnow = canvasSingleSnow(centerSnow); ctxSnow.drawImage(bigSnow, 0, 0, bigSnow.width, bigSnow.height, 0, 0, centerSnow * 2, centerSnow * 2); //畫六個小雪花 var smallSnow = canvasSingleSnow(centerSnow/3); var sizeSnow = centerSnow * 3/5;//小雪花的尺寸(直徑) var rSnow = centerSnow - sizeSnow/2;//小雪花的位置(離大雪花中心的距離) for(var i = 0; i < 6; i++){ ctxSnow.save(); ctxSnow.translate(centerSnow, centerSnow); ctxSnow.rotate(Math.PI*2 * i/6); ctxSnow.drawImage(smallSnow, 0, 0, smallSnow.width, smallSnow.height, rSnow - sizeSnow/2, -sizeSnow/2, sizeSnow, sizeSnow); ctxSnow.restore(); } return canvasSnow; }
上述代碼中尺寸部分說明:小雪花的尺寸比大雪花小,用比例可以方便縮放;小雪花的位置則固定在大雪花六條線的端點處。效果如下圖所示
將離屏canvas作為資源畫到實際顯示的canvas上1、封裝一個根據旋轉加載離屏canvas的函數
//r為雪花圖案中心距畫布中心的距離 //angle為雪花圖案在畫布上的安放角度 //size為雪花圖案的顯示尺寸 function drawSnowAngle(ctx,r,angle,size){ ctx.save(); ctx.rotate(Math.PI*2 * angle); drawLine(ctx,0,0,r,0,"#656565"); ctx.drawImage(canvasSnow, 0, 0, canvasSnow.width, canvasSnow.height, r - size/2, -size/2, size, size); ctx.restore(); }
2、可以將離屏canvas畫的雪花圖案畫到實際顯示的canvas上了
//center為實際顯示canvas的畫布中心(半徑) //rSnow為雪花圖案的半徑 drawSnowAngle(ctx, center - rSnow, i/snowNum, rSnow * 2);
3、加上動態旋轉效果
var snowNum = 1; var isAdd = true; var loop = setInterval("drawCanvas()", 10);//定時器,每10ms繪制一次 function drawCanvas(){ //設置旋轉效果 if(snowNum >= 18){isAdd = false;}//最大個數為18 else if(snowNum <= 1){isAdd = true;}//最小個數為1 if(isAdd){snowNum += snowNum/200;}//達到最大后開始遞減 else{snowNum -= snowNum/100;}//達到最少后開始遞增 //畫圖 var rSnow = center/2 * (snowNum - 6)/6;//設置雪花圖案顯示尺寸 canvasSnow = drawCanvasSnow(rSnow);//畫出離屏雪花圖案 ctx.clearRect(-center, -center, center * 2, center * 2);//清除畫布 for(var i = 0; i < snowNum; i++){//開始畫圖 drawSnowAngle(ctx, center - rSnow, i/snowNum, rSnow * 2); } }
旋轉的雪花就這樣完成了。效果見文章開頭的效果展示鏈接
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82971.html
摘要:常見優化方案模糊問題旋轉效果離屏自定義圖片尺寸實踐離屏旋轉效果實踐旋轉的雪花更新關于模糊問題前幾天研究的時候剛好趕上作者發布新版本,發現新版本截屏出來的效果比我對舊版本處理后畫布尺寸都設為倍的效果更好。 canvas常見優化方案——模糊問題、旋轉效果、離屏、自定義圖片尺寸 實踐demo——canvas離屏、旋轉效果實踐——旋轉的雪花 2017-12-18 16:27:35更新關于模糊問...
摘要:但需要注意的是,需在使用前調用。當然,你愿意的話也可以兩者結合著用。繪制圖像相信很多入門的,都看不到這個地方,不就是繪制圖像的嘛,啊不準確,是繪制圖形的。明確的說,是指圍繞原點圖像旋轉弧度。 前言 本文寫在七月底,進來不加班就整理了一下,一些非常基礎的知識,對于canvas剛入門的人來說,值得閱讀一下。 來個氣勢如虹的開頭 與看各種文章相比,我更喜歡數學里的邏輯;與學習各種日新月異的框...
閱讀 1246·2021-09-04 16:41
閱讀 2403·2021-09-02 10:18
閱讀 917·2019-08-29 16:40
閱讀 2614·2019-08-29 16:14
閱讀 898·2019-08-26 13:41
閱讀 1299·2019-08-26 12:24
閱讀 731·2019-08-26 10:24
閱讀 2869·2019-08-23 17:54