国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發 > 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>

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产偷窥洗澡视频| 自拍亚洲国产| 精精国产xxxx视频在线中文版| 国产美女被草| 青草在线视频在线观看| free性亚洲| 天堂资源最新在线| 伊人222成人综合网| 成年女人在线视频| 国产黄色网页| 久草网在线视频| 国产啊啊啊视频在线观看| av免费在线观看网站| 蜜桃av网站| 中文产幕区在线观看| 久久亚洲国产成人亚| 国产二级片在线| 超碰国产在线| 在线免费观看污| 国产在线精品一区二区不卡| 国产你懂的在线观看| 国产欧美日韩第一页| 超碰97国产精品人人cao| 国产一级黄色| 在线观看的网站你懂的| 中文字幕久热在线精品| 毛片视频免费观看| 先锋影音av中文字幕| 国产青青视频| 国产一级黄色| 中文字幕乱在线伦视频乱在线伦视频| wwww亚洲| www.九九热.com| 亚洲成人av高清| 在线黄色.com| 国产人成网在线播放va免费| 国产裸舞福利在线视频合集| 波多野结衣中文字幕久久| 精品伦理一区二区| 国产高潮又爽又无遮挡又免费| 国产精品亚洲第五区在线| 欧美国产中文| 交视频在线观看国产| 免费一区二区在线观看| 欧美激情福利视频在线观看免费| 国产大学生粉嫩无套流白浆| 国产精彩视频在线观看免费蜜芽| √天堂中文在线| 国产精品综合久久久久| 中文字幕毛片| 国产麻豆视频| 国产精品jvid在线观看| 国产精品白浆流出视频| 国产h在线观看| 亚洲欧美一区二区三区在线播放| 亚洲v片在线观看| 色悠久久久久综合网小说| av中文天堂在线| 久青青在线观看视频国产| 国产精品自产拍在线观看2019| 福利在线国产| 国产高清在线观看| www.操操操| 国产网站在线免费观看| 在线观看av网站| 天天噜天天色| 国产精品一区牛牛影视| 精品偷拍激情视频在线观看| 亚洲欧美一区二区三区在线播放| www.九九热.com| 国产一卡二卡3卡4卡四卡在线| 国产高清一区二区三区视频| 精品美女调教视频| 欧美高清视频| 99热99re6国产在线播放| 欧美婷婷久久五月精品三区| 国产精品综合久久久久| www狠狠操| 国产导航在线| 国产一二三区精品视频| 精品国产一区二区三区四区阿崩| 久草在线资源福利| 一区二区精品区| 国产婷婷视频在线| 超碰免费在线观看| 亚洲精品在线视频免费| 国产成人精品实拍在线| 国产一级视频| 国产免费网址| 日本视频在线| 日本在线观看网站| 在线国产一级| 在线亚洲电影| 91美女在线| 国产福利视频在线观看| а√最新版地址在线天堂| 9999在线视频| 国产传媒在线播放| 国产黄色在线| 精品视频在线一区二区| 91av福利| 精品三级久久久久久久电影聊斋 | 精精国产xxxx视频在线| 国产女呦网站| 中文字幕av高清| 精品街拍一区二区| 精品入口麻豆传煤| 精品全国在线一区二区| 中文av在线播放| 伊人影院在线观看| 亚洲精品影院在线| 超碰97国产精品人人cao| 操操操综合网| **三级三级97片毛片| 综合激情亚洲| 国产激情99| 日本成人免费网站| 好吊日视频在线观看| 99热在线观看免费| 中文国产字幕在线观看| 不卡av免费观看| 国产免费av高清在线| 国产裸舞福利在线视频合集| 中文字幕在线永久在线视频| 国产国语**毛片高清视频| av亚洲在线| 国内精品不卡| 国产精品爱久久久久久久小说 | 国产男女av| 999精品网| 99视频资源网| av影视在线看| 国产写真视频在线观看| 亚洲视频日韩| 国产高清免费av在线| 欧美亚洲系列| 992tv在线观看在线播放| 超碰在线影院| 精品欧美色视频网站在线观看| 免费三级毛片| 亚洲欧美精品日韩欧美| 国产一二三区在线| 操操操综合网| 精品国产一区二区三区不卡在线 | 伊人222成人综合网| 国产免费视频| av手机天堂| 91社区在线观看| 国产美女视频一区二区二三区| 97视频在线观看网站| 免费看av大片| 日本久久网站| 亚洲综合在线不卡| 精品一区二区三区在线成人| 国产三级视频在线看| 国产乱视频在线观看| 日本动漫同人动漫在线观看| 精品国产一区二区三区不卡在线| 国产精品99爱免费视频| 中文字幕日本在线观看| 天堂中文字幕在线| 九九在线观看免费视频| 国产主播福利在线| 91caoporn在线| 国产视频第一区| 国产精品一区二区资源| 国产乱妇乱子| 国产黄色av免费看| av免费在线一区二区三区| 在线观看wwww| 免费高清av| 国产一级性片| 精品久久久久一区二区三区| 国产国语**毛片高清视频| 国产wwww| 日本aⅴ写真网站免费| 九色成人在线| 国产高清一级片| 一本大道五月香蕉| 九色在线网站| 国产在线看片| 国产一级电影网| 在线黄色av| 国产毛片毛片| 在线激情网站| 天堂资源中文在线| 国产第一页在线视频| 色综合久久五月天| 国产精品美女一区二区视频| 怡红院av在线| 丁香花高清视频完整版在线观看| 国产美女高潮一区二区三区| 国产网站免费看| 欧美日韩不卡中文字幕在线| 国产精品外围在线观看| 精品51国产黑色丝袜高跟鞋| 午夜在线不卡| 国产二区三区在线| 日韩av成人| 日本啊v在线|