久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

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

本篇文章主要介紹了html5如何在Canvas中實現自定義路徑動畫示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

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

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

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

本篇文章主要介紹了canvas之自定義頭像功能實現代碼示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
HTML5 Canvas自定義圓角矩形與虛線示例代碼_html5教程技巧HTML5中文學習網,是中國最大的HTML5中文門戶,為廣大HTML5愛好者提供各種HTML5資料,包括HTML5網站、HTML5資訊、HTML5應用、HTML5游戲、
主站蜘蛛池模板: 亚洲视频免费观看 | 国产精品自产av一区二区三区 | 天天影视亚洲综合网 | 在线第一页 | 成人欧美一区二区三区在线播放 | 成人在线中文字幕 | 精品国产精品三级精品av网址 | 麻豆91av | 日批免费看 | av中文字幕在线 | 亚洲一区二区在线 | 在线亚洲免费 | 操操操av| 四虎永久免费黄色影片 | 亚洲精品日韩精品 | 美女天天干天天操 | 日本特黄特色aaa大片免费 | h片在线看 | 久久久高清 | 午夜精品网站 | 激情欧美日韩一区二区 | 性一交一乱一透一a级 | 国产精品1区2区3区 国产在线观看一区 | 亚洲高清视频一区 | 亚洲第一网站 | 区一区二在线观看 | 在线观看www高清视频 | 91黄在线观看 | 综合第一页 | 在线āv视频 | 免费毛片网 | 精精国产xxxx视频在线播放7 | 超碰成人免费 | 日韩av一区二区在线观看 | 男女性毛片 | 欧美视频免费在线 | 蜜桃视频在线观看免费视频网站www | 亚洲午夜视频 | 黄网免费 | 日本中文字幕在线观看 | 亚洲欧美在线一区 |