大家在先前了解過的前端中我們可以知道,在前端開發(fā)中 canvas在動(dòng)畫中的使用場(chǎng)景是比較廣泛的,所以今天就來和大家繼續(xù)分享有關(guān)于:“在html5使用canvas實(shí)現(xiàn)簡(jiǎn)單連線動(dòng)畫案例分享! ”這方面的相關(guān)內(nèi)容。
step1:繪制點(diǎn)
首先創(chuàng)建個(gè)標(biāo)簽<canvas id="canvas"></canvas>
設(shè)置幾個(gè)點(diǎn)的坐標(biāo):
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");
然后把點(diǎn)給畫出來:
points.forEach(([x, y]) => {
drawDot(x, y);
});
function drawDot(x1, y1, r) {
ctx.save();
ctx.beginPath(); //不寫會(huì)和線連起來
ctx.fillStyle = "red";
//繪制成矩形
ctx.arc(x1, y1, r ? r : 2, 0, 2 * Math.PI);
ctx.fill();
ctx.restore();
}
step2:繪制線條
我們封裝一個(gè)方法,傳入起點(diǎn)終點(diǎn),繪制一根線條
function drawLine(x1, y1, x2, y2) {
ctx.save();
ctx.beginPath(); //不寫每次都會(huì)重繪上次的線
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:線條動(dòng)畫
這里面需要計(jì)算兩點(diǎn)之間的斜率,然后x坐標(biāo)每次挪動(dòng)±1單位,已知斜率和x偏移,即可計(jì)算出y的偏移。值得注意的是,這個(gè)坐標(biāo)系和數(shù)學(xué)中的xy坐標(biāo)系有點(diǎn)不一樣,y軸是反的。然后可以引入額外的參數(shù)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; //線條繪制過程中的終點(diǎn)
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-連線動(dòng)畫</title>
</head>
<body>
<canvas id="canvas" width="400" height="400"></canvas>
<script>
//起點(diǎn):10,20 終點(diǎn):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; //線條繪制過程中的終點(diǎn)
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(); //不寫每次都會(huì)重繪上次的線
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(); //不寫會(huì)和線連起來
ctx.fillStyle = "red";
//繪制成矩形
ctx.arc(x1, y1, r ? r : 2, 0, 2 * Math.PI);
ctx.fill();
ctx.restore();
}
</script>
</body>
</html>
那么以上就是小編整理的有關(guān)于:“在html5使用canvas實(shí)現(xiàn)簡(jiǎn)單連線動(dòng)畫案例分享! ”這方面的相關(guān)內(nèi)容分享,當(dāng)然如果你對(duì)html5這方面有自己的其他見解也可以和大家伙一同分享你的經(jīng)驗(yàn)一同成長(zhǎng),如果你想全面提高自己的話我們可以在W3Cschool中進(jìn)行系統(tǒng)的學(xué)習(xí)。