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

首頁 > 開發 > HTML5 > 正文

canvas簡單連線動畫的實現代碼

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

前言:canvas動畫入門系列之簡單連線動畫。雖然簡單,但連線動畫應用場景還挺多,因此做了個小demo,一通百通。

step1:繪制點

首先創建個標簽<canvas id="canvas"></canvas>
設置幾個點的坐標

   const points = [        [200, 100], //上        [300, 200], //右        [100, 200], //左        [200, 100], //上        [200, 300], //下        [100, 200], //左        [300, 200], //右        [200, 300]      ];      const canvas = document.querySelector("canvas");      const ctx = canvas.getContext("2d");

然后把點給畫出來

points.forEach(([x, y]) => {          drawDot(x, y);        });function drawDot(x1, y1, r) {          ctx.save();          ctx.beginPath(); //不寫會和線連起來          ctx.fillStyle = "red";          //繪制成矩形          ctx.arc(x1, y1, r ? r : 2, 0, 2 * Math.PI);          ctx.fill();          ctx.restore();        }

step2:繪制線條

我們封裝一個方法,傳入起點終點,繪制一根線條

function drawLine(x1, y1, x2, y2) {          ctx.save();          ctx.beginPath(); //不寫每次都會重繪上次的線          ctx.lineCap = "round";          ctx.lineJoin = "round";          var grd = ctx.createLinearGradient(x1, y1, x2, y2);          ctx.moveTo(x1, y1);          ctx.lineTo(x2, y2);          ctx.closePath();          ctx.strokeStyle = "rgba(255,255,255,1)";          ctx.stroke();          ctx.restore();        }

step3:線條動畫

這里面需要計算兩點之間的斜率,然后x坐標每次挪動±1單位,已知斜率和x偏移,即可計算出y的偏移。值得注意的是,這個坐標系和數學中的xy坐標系有點不一樣,y軸是反的。然后可以引入額外的參數speed控制速度

function lineMove(points) {          if (points.length < 2) {                          return;          }          const [[x1, y1], [x2, y2]] = points;          let dx = x2 - x1;          let dy = y2 - y1;          if (Math.abs(dx) < 1 && Math.abs(dy) < 1) {            points = points.slice(1);            lineMove(points);            return;          }          let x = x1,            y = y1; //線條繪制過程中的終點          if (dx === 0) {            (x = x2), (y += (speed * dy) / Math.abs(dy));          } else if (dy === 0) {            x += (speed * dx) / Math.abs(dx);            y = y2;          } else if (Math.abs(dx) >= 1) {            let rate = dy / dx;            x += (speed * dx) / Math.abs(dx);            y += (speed * rate * dx) / Math.abs(dx);          }          drawLine(x1, y1, x, y);          points[0] = [x, y];          window.requestAnimationFrame(function() {            lineMove(points);          });        }

主要代碼就這么多,先看效果

完整代碼

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8" />  <meta name="viewport" content="width=device-width, initial-scale=1.0" />  <meta http-equiv="X-UA-Compatible" content="ie=edge" />  <title>canvas-連線動畫</title></head><body>  <canvas id="canvas" width="400" height="400"></canvas>  <script>    //起點:10,20 終點:150,200    const points = [      [200, 100], //上      [300, 200], //右      [100, 200], //左      [200, 100], //上      [200, 300], //下      [100, 200], //左      [300, 200], //右      [200, 300]    ];    const canvas = document.querySelector("canvas");    const ctx = canvas.getContext("2d");    // const img = new Image();    const speed = 10; //速度    // img.onload = function() {    // canvas.width = img.width;    // canvas.height = img.height;    animate(ctx);    // };    // img.src = "./imgs/demo.png";    function animate(ctx) {      // ctx.drawImage(img, 0, 0);      ctx.fillRect(0, 0, canvas.width, canvas.height);      points.forEach(([x, y]) => {        drawDot(x, y);      });      lineMove(points);    }    function lineMove(points) {      if (points.length < 2) {        return;      }      const [[x1, y1], [x2, y2]] = points;      let dx = x2 - x1;      let dy = y2 - y1;      if (Math.abs(dx) < 1 && Math.abs(dy) < 1) {        points = points.slice(1);        lineMove(points);        return;      }      let x = x1,        y = y1; //線條繪制過程中的終點      if (dx === 0) {        (x = x2), (y += (speed * dy) / Math.abs(dy));      } else if (dy === 0) {        x += (speed * dx) / Math.abs(dx);        y = y2;      } else if (Math.abs(dx) >= 1) {        let rate = dy / dx;        x += (speed * dx) / Math.abs(dx);        y += (speed * rate * dx) / Math.abs(dx);      }      drawLine(x1, y1, x, y);      points[0] = [x, y];      window.requestAnimationFrame(function () {        lineMove(points);      });    }    function drawLine(x1, y1, x2, y2) {      ctx.save();      ctx.beginPath(); //不寫每次都會重繪上次的線      ctx.lineCap = "round";      ctx.lineJoin = "round";      var grd = ctx.createLinearGradient(x1, y1, x2, y2);      ctx.moveTo(x1, y1);      ctx.lineTo(x2, y2);      ctx.closePath();      ctx.strokeStyle = "rgba(255,255,255,1)";      ctx.stroke();      ctx.restore();    }    function drawDot(x1, y1, r) {      ctx.save();      ctx.beginPath(); //不寫會和線連起來      ctx.fillStyle = "red";      //繪制成矩形      ctx.arc(x1, y1, r ? r : 2, 0, 2 * Math.PI);      ctx.fill();      ctx.restore();    }  </script></body></html>

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久秋霞鲁丝| 97视频在线观看免费高清完整版在线观看| 91探花福利精品国产自产在线| 久久久精品视频在线观看| 欧美有码在线观看视频| 日韩最新av在线| 国产一区二区日韩精品欧美精品| 日韩在线观看免费av| 亚洲精品美女久久久久| 欧美日韩在线视频首页| 中文欧美日本在线资源| 日韩视频亚洲视频| 欧美亚洲成人xxx| 欧美激情精品久久久久久久变态| 91精品久久久久久久久久久久久久| 亚洲成人久久网| 亚洲精品v欧美精品v日韩精品| 日韩高清电影免费观看完整| 中文字幕日韩欧美在线视频| 久久久久久久久久亚洲| 中日韩午夜理伦电影免费| 亚洲毛片一区二区| 欧美性videos高清精品| 一本一道久久a久久精品逆3p| 成人黄色在线免费| 亚洲天堂免费观看| 亚洲精品电影在线| 色哟哟亚洲精品一区二区| 日韩精品在线视频| 亚洲一区二区久久久| 丁香五六月婷婷久久激情| 国产精品十八以下禁看| 91成人性视频| 欧美一区二区大胆人体摄影专业网站| 精品久久久一区二区| 亚洲va久久久噜噜噜久久天堂| 国产日韩欧美夫妻视频在线观看| 亚洲欧美另类在线观看| 国产成人精品最新| 亚洲最大成人网色| 久久久久国产精品一区| 欧美性做爰毛片| 国产精品成人aaaaa网站| 久久国产精品久久久久久久久久| 国产精品高清网站| 国产成人精品亚洲精品| 久久免费视频这里只有精品| 黄网动漫久久久| 欧美激情一区二区久久久| 国产精品视频一区国模私拍| 在线日韩精品视频| 在线观看视频亚洲| 在线精品国产成人综合| 亚洲九九九在线观看| 成人97在线观看视频| 成人精品一区二区三区电影免费| 国产丝袜精品第一页| 色偷偷88888欧美精品久久久| 亚洲女人被黑人巨大进入al| 久久久久久com| 亚洲毛片一区二区| 亚洲第一色中文字幕| 国产精品狠色婷| 国产偷亚洲偷欧美偷精品| 亚洲欧美日韩精品久久亚洲区| 日本欧美爱爱爱| 国产精品一区二区三区毛片淫片| 国产精品国产自产拍高清av水多| 国产精品美女久久久久久免费| 91爱视频在线| 亚洲a级在线播放观看| 欧美午夜精品久久久久久浪潮| 日韩精品在线观看网站| 欧美激情精品在线| 国产精品18久久久久久首页狼| 久久久精品视频在线观看| 久久国内精品一国内精品| 亚洲成人av中文字幕| 久久精品这里热有精品| 日韩精品极品毛片系列视频| 亚洲aⅴ日韩av电影在线观看| 国a精品视频大全| 国产精品观看在线亚洲人成网| 51ⅴ精品国产91久久久久久| 国产一区香蕉久久| 日韩av中文字幕在线免费观看| 日韩大陆欧美高清视频区| 色婷婷久久一区二区| 91午夜在线播放| 国产视频综合在线| 亚洲加勒比久久88色综合| 久久免费少妇高潮久久精品99| 亚洲欧美在线x视频| 亚洲精品久久久久中文字幕欢迎你| 国产欧美亚洲视频| 91福利视频在线观看| 国产精品网红福利| 欧美性猛交xxxx富婆| 国产精品99久久久久久白浆小说| 国产一区二区三区在线播放免费观看| 久久亚洲精品毛片| 欧美成人一二三| 久久91亚洲精品中文字幕奶水| y97精品国产97久久久久久| 久久九九国产精品怡红院| 欧美性猛交xxxx黑人猛交| 日本欧美在线视频| 久久伊人91精品综合网站| 亚洲2020天天堂在线观看| 亚洲精品自拍视频| 国产精品久久久久久久久久| 久久久久这里只有精品| 久久艳片www.17c.com| 日韩激情第一页| 日韩亚洲欧美中文在线| 国产精品视频专区| 国产日韩在线看| 成人网在线免费看| 欧美午夜激情视频| 国产啪精品视频网站| 亚洲激情中文字幕| 亚洲人成电影网站| 日韩av手机在线观看| 欧美激情手机在线视频| 亚洲免费电影一区| 色播久久人人爽人人爽人人片视av| 亚洲福利在线看| 久久91亚洲精品中文字幕奶水| 日本久久久久亚洲中字幕| 浅井舞香一区二区| 久久精品国产成人精品| 一区二区三区黄色| 欧美激情精品久久久久久黑人| 日韩免费视频在线观看| 成人乱人伦精品视频在线观看| 色狠狠久久aa北条麻妃| 在线成人中文字幕| 欧美极品美女电影一区| 97视频国产在线| 最好看的2019的中文字幕视频| 亚洲色图激情小说| 久久精品国产亚洲一区二区| 国产玖玖精品视频| 国产成人午夜视频网址| 日韩久久精品成人| 亚洲欧美日韩一区二区三区在线| 欧美日韩在线观看视频小说| 久久99亚洲热视| 亚洲片国产一区一级在线观看| 久久久久久久电影一区| 国产色视频一区| 亚洲成人亚洲激情| 亚洲精品乱码久久久久久按摩观| 色综合久久88色综合天天看泰| 日本精品视频在线播放| 97在线视频免费播放| 久久久久久尹人网香蕉| 亚洲午夜久久久影院| 亚洲精品久久在线| 福利精品视频在线| 精品久久中文字幕久久av| 国产亚洲精品va在线观看| 成人性生交大片免费观看嘿嘿视频| 成人妇女免费播放久久久|