亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > HTML5 > 正文

html5如何在Canvas中實現自定義路徑動畫示例

2024-09-05 07:22:09
字體:
來源:轉載
供稿:網友

在最近的項目中筆者需要做一個新需求:在canvas中實現自定義的路徑動畫。這里所謂的自定義路徑不單單包括一條直線,也許是多條直線的運動組合,甚至還包含了貝塞爾曲線,因此,這個動畫也許是下面這個樣子的:

那么如何才能在canvas中實現這種動畫效果呢?其實很簡單,對于路徑的處理svg非常在行,因此在canvas中實現自定義路徑動畫,我們需要借助svg的力量。

創建Path

制作動畫前,先要拿到動畫的路徑,對此我們可以直接使用svg的path定義規則,比如我們定義了一條較為復雜的路徑(它到底長什么樣大家可以自己試試,這里就不展示了),然后,我們需要將定義好的路徑導入進一個新生成的path元素中(我們只是借助svg的api,因此并不需要將其插到頁面內)

const path = 'M0,0 C8,33.90861 25.90861,16 48,16 C70.09139,16 88,33.90861 88,56 C88,78.09139 105.90861,92 128,92 C150.09139,92 160,72 160,56 C160,40 148,24 128,24 C108,24 96,40 96,56 C96,72 105.90861,92 128,92 C154,93 168,78 168,56 C168,33.90861 185.90861,16 208,16 C230.09139,16 248,33.90861 248,56 C248,78.09139 230.09139,96 208,96 L48,96 C25.90861,96 8,78.09139 8,56 Z';const pathElement = document.createElementNS('http://www.w3.org/2000/svg',"path"); pathElement.setAttributeNS(null, 'd', path);

getTotalLength與getPointAtLength

SVGPathElement提供的這兩個api很關鍵,可以說它是實現路徑動畫的最為核心的地方(在svg內實現自定義路徑動畫一般也是通過這兩個api去解決)詳情請戳:SVGPathElement MDN

getTotalLength方法可以獲取SVGPathElement的總長度

getPointAtLength方法,傳入一個長度x,將返回距離SVGPathElement起點的長度為x的終點坐標。

利用這兩個api,通過循環的方式不斷去更新canvas內所繪制的圖形坐標,即可實現路徑動畫:

const length = pathElement.getTotalLength();const duration = 1000; // 動畫總時長const interval = length / duration;const canvas = document.querySelector('canvas');const context = canvas.getContext('2d');let time = 0, step = 0; const timer = setInterval(function() {  if (time <= duration) {    const x = parseInt(pathElement.getPointAtLength(step).x);    const y = parseInt(pathElement.getPointAtLength(step).y);    move(x, y);  // 更新canvas所繪制圖形的坐標    step++;  } else {    clearInterval(timer)  }}, interval);function move(x, y) {   context.clearRect(0, 0, canvas.width, canvas.height);   context.beginPath();   context.arc(x, y, 25, 0, Math.PI*2, true);   context.fillStyle = '#f0f';   context.fill();   context.closePath();}

最后,我們把它封裝一下,即可實現一個在canvas中實現自定義動畫的簡易函數啦:

function customizePath(path, func) {    const pathElement = document.createElementNS('http://www.w3.org/2000/svg',"path");     pathElement.setAttributeNS(null, 'd', path);      const length = pathElement.getTotalLength();    const duration = 1000;     const interval = length / duration;    let time = 0, step = 0;         const timer = setInterval(function() {        if (time <= duration) {              const x = parseInt(pathElement.getPointAtLength(step).x);              const y = parseInt(pathElement.getPointAtLength(step).y);              func(x, y);              step++;        } else {              clearInterval(timer)        }     }, interval);}const path = 'M0,0 C8,33.90861 25.90861,16 48,16 C70.09139,16 88,33.90861 88,56 C88,78.09139 105.90861,92 128,92 C150.09139,92 160,72 160,56 C160,40 148,24 128,24 C108,24 96,40 96,56 C96,72 105.90861,92 128,92 C154,93 168,78 168,56 C168,33.90861 185.90861,16 208,16 C230.09139,16 248,33.90861 248,56 C248,78.09139 230.09139,96 208,96 L48,96 C25.90861,96 8,78.09139 8,56 Z';const canvas = document.querySelector('canvas');const context = canvas.getContext('2d');function move(x, y) {      context.clearRect(0, 0, canvas.width, canvas.height);    context.beginPath();      context.arc(x, y, 25, 0, Math.PI*2, true);      context.fillStyle = '#f0f';      context.fill();      context.closePath();}customizePath(path, move);

實現思路大致如上所述,然而這并不是最終成果。當我們決定要在canvas制作自定義路徑動畫時,我們不僅要考慮如何實現,更要考慮性能優化,比如在這個實現思路中,我們是否可以減少不必要的渲染次數?幀率如何控制達到最優?等等。

雖然它們并不在這篇文章的討論范圍中,當也應當值得我們思考。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91av福利视频| 日韩精品免费观看| 国内精品久久久久影院优| 在线观看中文字幕亚洲| 日韩av网址在线观看| 国产999视频| 日韩亚洲一区二区| 久久伊人精品天天| 久久久久久久久久久久av| 中国china体内裑精亚洲片| 久久精品国产一区二区电影| 欧美日韩国产中文字幕| 国产精品网红直播| 91国语精品自产拍在线观看性色| 国产成人午夜视频网址| 最近2019中文字幕大全第二页| 亚洲日本成人女熟在线观看| 91精品视频在线看| 国产精品国产三级国产专播精品人| 亚洲人成亚洲人成在线观看| 久久影院模特热| 欧美精品手机在线| 亚洲国产精品字幕| 国产999精品| 亚洲国产精品va在线观看黑人| 欧美日韩国产成人| 国产精品69精品一区二区三区| 久久久视频精品| 伊人久久大香线蕉av一区二区| 亚洲直播在线一区| 狠狠躁夜夜躁人人躁婷婷91| 欧美日韩亚洲一区二区三区| 欧美午夜精品伦理| 亚洲九九九在线观看| 国产精品嫩草视频| 国产欧美日韩91| 日韩免费黄色av| 国产精品第三页| 精品国产欧美一区二区五十路| 亚洲无亚洲人成网站77777| 国产欧美精品在线| 久久精品国产久精国产思思| 这里只有精品视频在线| 中文字幕日韩有码| 亚洲风情亚aⅴ在线发布| 97在线视频国产| 自拍偷拍亚洲欧美| 亚洲摸下面视频| 视频一区视频二区国产精品| 91爱爱小视频k| 97热精品视频官网| 日韩av有码在线| 日韩精品在线第一页| 亚洲一区二区三| 97涩涩爰在线观看亚洲| 成人免费看吃奶视频网站| 国产精品免费在线免费| 欧美一乱一性一交一视频| 国产中文欧美精品| 久久久中精品2020中文| 国产欧美日韩免费| 久久999免费视频| 中文字幕亚洲欧美一区二区三区| 91香蕉国产在线观看| 色www亚洲国产张柏芝| 亚洲国产女人aaa毛片在线| 国产91在线播放| 亚洲影视中文字幕| 亚洲国产日韩欧美在线图片| 亚洲美女免费精品视频在线观看| 久久精视频免费在线久久完整在线看| 国产欧美日韩丝袜精品一区| 久久精品中文字幕电影| 国产色综合天天综合网| 国产日韩视频在线观看| 91影视免费在线观看| 日韩禁在线播放| wwwwwwww亚洲| 中文字幕亚洲综合| 亚洲男人天堂手机在线| 亚洲精品第一国产综合精品| 成人在线观看视频网站| 自拍偷拍亚洲区| 国产精品电影久久久久电影网| 日韩在线观看视频免费| 91色精品视频在线| 国产精欧美一区二区三区| 日韩欧美主播在线| 欧美寡妇偷汉性猛交| 精品国产91久久久| 美日韩精品免费视频| 亚洲高清免费观看高清完整版| 国产一区二区三区四区福利| 亚洲天堂网站在线观看视频| 亚洲综合在线中文字幕| 亚洲三级黄色在线观看| 国产亚洲精品久久久久动| 久久免费精品视频| 国产精品高清在线观看| 亚洲国产毛片完整版| 深夜成人在线观看| 91在线视频导航| 午夜精品久久久久久久99热浪潮| 欧美性生交xxxxxdddd| 黄色一区二区在线观看| 国产精品色午夜在线观看| 国产999精品久久久| 国产第一区电影| 最近2019年日本中文免费字幕| 亚洲色在线视频| 久久在精品线影院精品国产| 日韩亚洲欧美成人| 深夜精品寂寞黄网站在线观看| 久久久www成人免费精品张筱雨| 尤物tv国产一区| 欧美日本啪啪无遮挡网站| 国产精品一久久香蕉国产线看观看| 欧美一级黄色网| 亚洲偷熟乱区亚洲香蕉av| 欧美乱人伦中文字幕在线| 91精品国产沙发| 欧美精品手机在线| 波霸ol色综合久久| 伊人久久男人天堂| 色噜噜国产精品视频一区二区| 78色国产精品| 欧美成人在线网站| 亚洲精品免费一区二区三区| 中文字幕日韩欧美在线视频| 亚洲老头老太hd| 亚洲色图五月天| 在线观看精品国产视频| 国产一区红桃视频| 日韩av网站在线| 国产精品扒开腿做爽爽爽的视频| 国产精品爱久久久久久久| 久久香蕉精品香蕉| 国产精品久久久久久久久粉嫩av| 日韩福利在线播放| 最好看的2019年中文视频| 亚洲欧洲激情在线| 亚洲第一福利网| 在线电影欧美日韩一区二区私密| 亚洲国产成人精品女人久久久| 亚洲精品网址在线观看| 午夜精品在线观看| 日韩精品中文字幕在线| 久久久999精品| 成人性生交大片免费看小说| 国产精品视频在线观看| 欧美日韩国产丝袜美女| 国产精品jizz在线观看麻豆| 亚洲欧美中文字幕在线一区| 日韩毛片中文字幕| 日韩av电影手机在线观看| 久久青草精品视频免费观看| 91夜夜未满十八勿入爽爽影院| 亚洲精品视频网上网址在线观看| 性欧美视频videos6一9| 欧美精品久久久久久久久| 亚洲奶大毛多的老太婆| 欧美日韩国产综合新一区| 日本精品久久电影| 日韩av免费在线观看|