久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

canvas中普通動效與粒子動效的實現 方法介紹(代碼示例)

本篇文章給大家帶來的內容是關于canvas中普通動效與粒子動效的實現 方法介紹(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

canvas用于在網頁上繪制圖像、動畫,可以將其理解為畫布,在這個畫布上構建想要的效果。

canvas可以繪制動態效果,除了常用的規則動畫之外,還可以采用粒子的概念來實現較復雜的動效,本文分別采用普通動效與粒子特效實現了一個簡單的時鐘。

普通時鐘

普通動效即利用canvas的api,實現有規則的圖案、動畫。

效果

canvas中普通動效與粒子動效的實現 方法介紹(代碼示例)

該效果實現比較簡單,主要分析一下刻度與指針角度偏移的實現。

繪制刻度

此例為小時刻度的繪制:表盤上共有12個小時,Math.PI為180°,每小時占據30°。
.save()表示保存canvas當前環境的狀態,在此基礎上進行繪制。繪制完成之后,返回之前保存過的路徑狀態和屬性。

分鐘刻度同理,改變角度與樣式即可。

  // 小時時間刻度   offscreenCanvasCtx.save();   for (var i = 0; i < 12; i++) {     offscreenCanvasCtx.beginPath();     // 刻度顏色     offscreenCanvasCtx.strokeStyle = '#fff';     // 刻度寬度     offscreenCanvasCtx.lineWidth = 3;     // 每小時占據30°     offscreenCanvasCtx.rotate(Math.PI / 6);     // 開始繪制的位置     offscreenCanvasCtx.lineTo(140, 0)     // 結束繪制的位置;     offscreenCanvasCtx.lineTo(120, 0);     // 繪制路徑     offscreenCanvasCtx.stroke();   }   offscreenCanvasCtx.restore();

指針指向

以秒針為例:獲取當前時間的秒數,并計算對應的偏移角度

  var now = new Date(),     sec = now.getSeconds(),     min = now.getMinutes(),     hr = now.getHours();   hr = hr > 12 ? hr - 12 : hr;   //秒針   offscreenCanvasCtx.save();   offscreenCanvasCtx.rotate(sec * (Math.PI / 30));   ......   offscreenCanvasCtx.stroke();

粒子動效

canvas可以用來繪制復雜,不規則的動畫。粒子特效可以用來實現復雜、隨機的動態效果。

粒子,指圖像數據imageData中的每一個像素點,獲取到每個像素點之后,添加屬性或事件對區域內的粒子進行交互,達到動態效果。

效果

canvas中普通動效與粒子動效的實現 方法介紹(代碼示例)

粒子獲取

以下圖的圖片轉化為例,該效果是先在canvas上渲染圖片,然后獲取文字所在區域的每個像素點。

  let image = new Image();   image.src='../image/logo.png';   let pixels=[]; //存儲像素數據   let imageData;   image.width = 300;   image.height = 300   // 渲染圖片,并獲取該區域內像素信息   image.onload=function(){     ctx.drawImage(image,(canvas.width-image.width)/2,(canvas.height-image.height)/2,image.width,image.height);     imageData=ctx.getImageData((canvas.width-image.width)/2,(canvas.height-image.height)/2,image.width,image.height); //獲取圖表像素信息  //繪制圖像   };

像素信息

圖片的大小為300*300,共有90000個像素,每個像素占4位,存放rgba數據。

canvas中普通動效與粒子動效的實現 方法介紹(代碼示例)

粒子繪制

  function getPixels(){     var pos=0;     var data=imageData.data; //RGBA的一維數組數據     //源圖像的高度和寬度為300px     for(var i=1;i<=image.width;i++){       for(var j=1;j<=image.height;j++){         pos=[(i-1)*image.width+(j-1)]*4; //取得像素位置         if(data[pos]>=0){           var pixel={             x:(canvas.width-image.width)/2+j+Math.random()*20, //重新設置每個像素的位置信息             y:(canvas.height-image.height)/2+i+Math.random()*20, //重新設置每個像素的位置信息             fillStyle:'rgba('+data[pos]+','+(data[pos+1])+','+(data[pos+2])+','+(data[pos+3])+')'           }           pixels.push(pixel);         }       }     }   }   function drawPixels() {     var canvas = document.getElementById("myCanvas");     var ctx = canvas.getContext("2d");     ctx.clearRect(0,0,canvas.width,canvas.height);     var len = pixels.length, curr_pixel = null;     for (var i = 0; i < len; i++) {       curr_pixel = pixels[i];       ctx.fillStyle = curr_pixel.fillStyle;       ctx.fillRect(curr_pixel.x, curr_pixel.y, 1, 1);     }   }

粒子時鐘

渲染文字時鐘

  function time() {     ctx.clearRect(0,0,canvas.width,canvas.height)     ctx.font = "150px 黑體";     ctx.textBaseline='top';     ctx.fillStyle = "rgba(245,245,245,0.2)";     ctx.fillText(new Date().format('hh:mm:ss'),(canvas.width-textWidth)/2,(canvas.height-textHeight)/2,textWidth,textHeight);   }

效果

canvas中普通動效與粒子動效的實現 方法介紹(代碼示例)

獲取粒子

文字轉換粒子概念同上,獲取選定區域的像素,根據篩選條件進行選擇并存入數組。經過遍歷后重新繪制。

  function getPixels(){     let imgData = ctx.getImageData((canvas.width-textWidth)/2,(canvas.height-textHeight)/2,textWidth,textHeight);     let data = imgData.data     pixelsArr = []     for(let i=1;i<=textHeight;i++){       for(let j=1;j<=textWidth;j++){         pos=[(i-1)*textWidth+(j-1)]*4; //取得像素位置         if(data[pos]>=0){           var pixel={             x:j+Math.random()*20, //重新設置每個像素的位置信息             y:i+Math.random()*20, //重新設置每個像素的位置信息             fillStyle:'rgba('+data[pos]+','+(data[pos+1])+','+(data[pos+2])+','+(data[pos+3])+')'           };           pixelsArr.push(pixel);         }       }     }   }

imgData保存了所選區域內的像素信息,每個像素點占據4位,保存了RGBA四位信息。篩選每個像素的第四位,這段代碼中將所有透明度不為0的像素都保存到了數組pixelsArr中。

xy記載了該粒子的位置信息,為了產生效果圖中的運動效果,給每個粒子添加了0-20個像素的偏移位置,每次重繪時,偏移位置隨機生成,產生運動效果。

粒子重繪

獲取粒子之后,需要清除畫布中原有的文字,將獲取到的粒子重新繪制到畫布上去。

  function drawPixels() {     // 清除畫布內容,進行重繪     ctx.clearRect(0,0,canvas.width,canvas.height);     for (let i in pixelsArr) {       ctx.fillStyle = pixelsArr[i].fillStyle;       let r = Math.random()*4       ctx.fillRect(pixelsArr[i].x, pixelsArr[i].y, r, r);     }   }

粒子重繪時的樣式為篩選像素時原本的顏色與透明度,并且每個在畫布上繪制每個粒子時,定義大小參數r,r取值為0-4中隨機的數字。最終生成的粒子大小隨機。

實時刷新

獲取粒子并成功重繪之后,需要頁面實時刷新時間。這里采用window.requestAnimationFrame(callback)方法。

  function time() {     ......     getpixels(); //獲取粒子     drawPixels(); // 重繪粒子     requestAnimationFrame(time);   }

window.requestAnimationFrame(callback) 方法告訴瀏覽器您希望執行動畫并請求瀏覽器在下一次重繪之前調用指定的函數來更新動畫。該方法使用一個回調函數作為參數,這個回調函數會在瀏覽器重繪之前調用。

該方法不需要設置時間間隔,調用頻率采用系統時間間隔(1s)。

文檔解釋戳這里

效果

canvas中普通動效與粒子動效的實現 方法介紹(代碼示例)

總結

本文主要通過兩種不同的方式實現了時鐘的動態效果,其中粒子時鐘具有更多的可操作性。在以后的canvas系列中會針對粒子系統實現更多的動態效果。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
国产精品美女久久久| 国产美女久久| 久久字幕精品一区| 欧美日韩国产一区二区在线观看| 视频一区二区欧美| 视频一区在线视频| 亚洲精品伊人| 亚洲视频二区| 日韩欧美2区| 欧美日韩精品一区二区三区视频 | 免费高潮视频95在线观看网站| 日韩有吗在线观看| 日韩av中文字幕一区二区三区| 91亚洲精品在看在线观看高清| 日本精品在线播放| 国产亚洲观看| 久久精品国产久精国产爱| 欧美国产精品| 成人美女视频| 激情欧美日韩一区| 黄色免费成人| 综合在线一区| 国产一卡不卡| 精品久久久久久久| 91精品精品| 欧美/亚洲一区| 亚洲伊人精品酒店| 欧美久久香蕉| 日韩高清不卡在线| 色88888久久久久久影院| 亚洲日韩中文字幕一区| 日本aⅴ免费视频一区二区三区| 亚洲一区二区三区高清不卡| 国产精品一区二区中文字幕| 中文久久精品| 日韩av一区二区三区| 精品一区视频| 人人精品亚洲| 亚洲精选av| 欧美国产日韩电影| 91一区二区| 国产亚洲一级| 国产探花一区| 91tv亚洲精品香蕉国产一区| 只有精品亚洲| 国内在线观看一区二区三区 | 久久久久久一区二区| 婷婷综合成人| 精品欧美日韩精品| 夜夜嗨网站十八久久| 欧美亚洲一区二区三区| 欧美少妇精品| 日韩区一区二| 日韩高清欧美| 日韩精品久久理论片| 日韩精品诱惑一区?区三区| 人人精品人人爱| 久久久久久色 | 婷婷成人综合| 亚洲精品日韩久久| 高清av不卡| 亚洲欧美日本国产| 久久精品国产在热久久| 日韩在线观看一区| 日韩成人一级| av一区在线| 国产欧美三级| 中文字幕日本一区二区| 综合日韩av| 亚洲精品欧美| 久久精品不卡| 久久超级碰碰| 一区二区电影在线观看| 国产超碰精品| 国产精品久久久一区二区| 视频一区中文| 精品国产一级| 日韩精品免费视频一区二区三区 | 国产精品v一区二区三区| 今天的高清视频免费播放成人| 国产精品一区三区在线观看| 亚洲一区网站| 久久久影院免费| 精品精品99| 日韩国产在线一| 国产一区二区精品| 国产91一区| 不卡一二三区| 精品久久久久中文字幕小说| 日韩三级久久| 午夜一级在线看亚洲| 日韩一区二区三区在线免费观看| 日本精品影院| 久久免费影院| 91国内精品| 国产精品久久久久久久免费软件 | 久久亚洲风情| 婷婷久久一区| 啪啪国产精品| 黄色网一区二区| 国产精品欧美一区二区三区不卡| 香蕉久久久久久| 蜜桃伊人久久| 欧美日韩精品一本二本三本| 日产精品一区| 精品免费av在线| 婷婷五月色综合香五月| 亚洲激情精品| 亚洲午夜av| 蜜桃精品在线| 偷拍精品精品一区二区三区| 国产aⅴ精品一区二区四区| 国产精品一级在线观看| 日韩高清欧美激情| 婷婷综合一区| 日韩欧美中文字幕电影| 日韩精品一级中文字幕精品视频免费观看 | 久久久久久久久久久9不雅视频| 美女视频免费精品| 国产精品嫩模av在线| 国产欧美激情| 国产精品网站在线看| 国产精品一区二区三区www | 国产欧美成人| 国产女人18毛片水真多18精品| 久久国内精品| 欧美自拍一区| 国产精品亚洲片在线播放| 一区在线视频观看| 国产精品97| 亚洲一区黄色| 中文字幕一区二区三区日韩精品 | 亚洲精品美女91| 综合五月婷婷| 日欧美一区二区| 欧美日韩一区二区三区不卡视频| 97精品久久| 老司机精品视频网| 91视频一区| 欧美高清不卡| 91欧美精品| 麻豆精品新av中文字幕| 国产精品福利在线观看播放| 天堂中文av在线资源库| 91精品蜜臀一区二区三区在线| 激情久久久久久久| 日韩一区精品视频| 中文字幕日韩高清在线| 日本不卡高清| 国产精品对白久久久久粗| 国产极品一区| 久久久久久一区二区| 中文在线а√在线8| 国产一区日韩| 欧美午夜精彩| 一区二区三区四区精品视频| 日本久久二区| 国产66精品| 欧美福利一区| 日本成人中文字幕| 精品一区二区三区视频在线播放| 中文字幕在线看片| 先锋亚洲精品| 日本va欧美va精品| 97在线精品| 蜜桃视频欧美| 婷婷视频一区二区三区| 美女国产精品久久久| 成人久久一区| 亚洲精品在线a| 福利视频一区| 日韩欧美中文字幕在线视频| 欧美黄页在线免费观看 | 日本在线精品| 亚洲免费一区三区| 欧美aa在线视频| 亚洲天堂成人| 欧美日韩一区自拍| 都市激情国产精品| 蜜臀va亚洲va欧美va天堂| 国产伦一区二区三区| 久久视频一区| 国产在线看片免费视频在线观看| 国产亚洲精品v| 亚洲美女久久| 9999国产精品| 蜜臀精品一区二区三区在线观看 | 国产精品sm| 亚洲福利专区| 欧美偷窥清纯综合图区| 秋霞影视一区二区三区| 欧美久久亚洲| 国产偷自视频区视频一区二区| 美女久久久久久| 老司机久久99久久精品播放免费| 精品一区二区三区中文字幕视频 | 国产精品网址| 91精品观看| 欧美精品1区| 免费看的黄色欧美网站|