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

首頁 > 編程 > HTML > 正文

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

2024-08-26 00:20:01
字體:
來源:轉載
供稿:網友

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

canvas實現路徑動畫,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制作自定義路徑動畫時,我們不僅要考慮如何實現,更要考慮性能優化,比如在這個實現思路中,我們是否可以減少不必要的渲染次數?幀率如何控制達到最優?等等。

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

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


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区三区在线视频| 日本午夜人人精品| 欧美精品亚州精品| 亚洲精品丝袜日韩| 欧美成人在线网站| 亚洲成色777777女色窝| 精品国产成人av| 免费99精品国产自在在线| 日韩av在线一区二区| 国产精品爱啪在线线免费观看| 日韩在线免费观看视频| 国产精品午夜一区二区欲梦| 亚洲欧美日韩在线高清直播| 91久久久久久久久久久久久| 久久久久久久久久久久av| 国产男人精品视频| 欧美大荫蒂xxx| 清纯唯美亚洲综合| 国产视频观看一区| 色多多国产成人永久免费网站| 久久久999精品视频| 亚洲影院色在线观看免费| 国产成人精品久久二区二区91| 久久久人成影片一区二区三区观看| 国产精品大陆在线观看| 欧美成人精品在线视频| 一本一本久久a久久精品牛牛影视| 精品国内自产拍在线观看| 欧美日韩亚洲系列| 亚洲国产日韩欧美综合久久| 亚洲精品久久久久久久久久久久| 红桃视频成人在线观看| 色琪琪综合男人的天堂aⅴ视频| 国产精品小说在线| 日韩av有码在线| 亚洲乱亚洲乱妇无码| 福利视频导航一区| 国产精品日韩在线| 伊人伊成久久人综合网站| 精品国产户外野外| 久久久国产影院| 久久激情五月丁香伊人| 国产精品久久久久久搜索| 欧美一区二区大胆人体摄影专业网站| 精品国产乱码久久久久久婷婷| 欧美大尺度激情区在线播放| 亚洲最大av网站| 亚洲欧洲一区二区三区在线观看| 亚洲最新av在线| 亚洲香蕉成视频在线观看| 97成人精品视频在线观看| 国产美女久久精品香蕉69| 欧美成人h版在线观看| 亚洲va久久久噜噜噜久久天堂| 国产精品久在线观看| 97精品久久久| 久久精品小视频| 欧美激情手机在线视频| 国产精品一区二区久久久| 91av在线影院| 日韩视频免费大全中文字幕| 久久久精品视频成人| 日韩亚洲一区二区| 亚洲国产精品va| 久久人91精品久久久久久不卡| 2018中文字幕一区二区三区| 国产在线视频2019最新视频| 亚洲男人天堂视频| 亚洲精品mp4| 91美女片黄在线观看游戏| 国自在线精品视频| 久久99青青精品免费观看| 91精品视频在线免费观看| www亚洲欧美| 久久久久九九九九| 欧美激情免费在线| 国产精品电影久久久久电影网| 欧美性受xxxx黑人猛交| 亚洲精品美女在线| 国外成人在线播放| 欧美国产日韩免费| 亚洲加勒比久久88色综合| 日韩国产高清视频在线| …久久精品99久久香蕉国产| 97色伦亚洲国产| 久久亚洲精品国产亚洲老地址| 亚洲天堂男人天堂女人天堂| 亚洲精品动漫久久久久| 亚洲精品美女在线观看播放| 久久99热这里只有精品国产| 久精品免费视频| 日韩有码在线视频| 日韩中文字幕国产| 国产精品视频不卡| 国内精品免费午夜毛片| 久久精品人人爽| 2025国产精品视频| 欧美激情va永久在线播放| 欧美黄色片免费观看| 国产噜噜噜噜噜久久久久久久久| 国产精品高潮粉嫩av| 亚洲黄色www| 福利视频导航一区| 成人免费淫片aa视频免费| 欧美性xxxx极品高清hd直播| 精品偷拍各种wc美女嘘嘘| 欧美日韩成人在线视频| 日韩久久精品电影| 伊人亚洲福利一区二区三区| 成人精品一区二区三区电影免费| 亚洲人成电影网站色xx| 丝袜亚洲另类欧美重口| 欧美黑人xxxⅹ高潮交| 成人黄色av播放免费| 青青草国产精品一区二区| 91在线视频九色| 国产精品扒开腿爽爽爽视频| 亚洲综合视频1区| 亚洲国产日韩欧美综合久久| 精品久久国产精品| 久久综合伊人77777| 欧美成人精品三级在线观看| 久久九九国产精品怡红院| 欧美激情综合色综合啪啪五月| 久久av在线看| 亚洲人成在线电影| 2018日韩中文字幕| 亚洲大胆人体av| 日韩欧美成人精品| www.欧美精品| 亚洲第一精品夜夜躁人人躁| 国产亚洲精品成人av久久ww| 韩国v欧美v日本v亚洲| 久久精品亚洲国产| 成人有码在线播放| 55夜色66夜色国产精品视频| 中文字幕在线国产精品| 日韩视频免费看| 茄子视频成人在线| 国产xxx69麻豆国语对白| 日韩在线视频播放| 日韩精品在线观看一区二区| 91精品国产91久久久久久最新| 日本高清视频精品| 久久久成人精品| 日本一区二区在线播放| 国产精品色视频| 国产综合久久久久| 欧美天堂在线观看| 日韩中文av在线| 欧美成年人视频网站欧美| 欧美精品一本久久男人的天堂| 欧美一级大胆视频| 久久久久免费精品国产| 日韩av在线导航| 97视频在线看| 亚洲四色影视在线观看| 亚洲成av人片在线观看香蕉| 亚洲欧美日韩久久久久久| 亚洲成人黄色在线| 欧美激情第一页xxx| 亚洲精品在线看| 国产精品免费久久久| 欧美极度另类性三渗透|