gpt4 book ai didi

javascript - 使用 HTML5 canvas 在另一个动画之后对一行进行动画处理

转载 作者:行者123 更新时间:2023-11-29 18:15:07 25 4
gpt4 key购买 nike

我遇到的问题是我的直线在页面加载开始时开始向圆圈动画。在我的第一个动画完成后(即圆圈),我无法弄清楚让线条在另一个方向上动画的逻辑。

总的来说,我想完成一个双动画,其中直线开始向左移动,从圆开始,只有在圆完成其完整动画之后。

HTML

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<canvas id="cas"></canvas>
</body>
</html>

Javascript

$(function () {
//gloabl definitions
var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
var canvas = document.getElementById('cas');
var context = canvas.getContext('2d');

canvas.width = 470;
canvas.height = 400;

//core plugin features & call
var circleDefaults = {
circlePos: {
x: 338,
y: 130
},
radius: 120,
counterClockwise: false,
startAngle: Math.PI / 2,
endAngle: Math.PI * 2,
currentPercent: 0,
endPercent: 90
}

var lineDefaults = {
movePos: {
x: 0,
y: 80
},
linePos: {
x: 10,
y: 80
}
}

function AnimateCircle(current) {
context.beginPath();
context.arc(circleDefaults.circlePos.x, circleDefaults.circlePos.y, circleDefaults.radius, -(circleDefaults.startAngle), ((circleDefaults.endAngle) * current) - circleDefaults.startAngle, circleDefaults.counterClockwise);
context.lineWidth = 0.5;

context.strokeStyle = "#000"
context.stroke();
context.closePath();

context.beginPath();
context.moveTo(830, 80);
context.lineTo(400, 80);
context.stroke();
context.closePath();

circleDefaults.currentPercent++;
if (circleDefaults.currentPercent < circleDefaults.endPercent) {
requestAnimationFrame(function () {
AnimateCircle(circleDefaults.currentPercent / 100);
});
}
}

function AnimateLine() {
context.beginPath();
context.moveTo(lineDefaults.movePos.x, lineDefaults.movePos.y);
context.lineTo(lineDefaults.linePos.x, lineDefaults.linePos.y);
context.stroke();
context.closePath();

lineDefaults.linePos.x++;

if (circleDefaults.currentPercent < lineDefaults.linePos.x) {
requestAnimationFrame(function () {
AnimateLine();
});
}
}

AnimateCircle();
AnimateLine();
});

下面是我的 fiddle :

http://jsfiddle.net/coder101/fa28A/

谢谢!

最佳答案

你说的是这种动画吗? http://jsfiddle.net/fa28A/1/

让我们继续逐一分析您的每一个问题。

where the straight line starts to animate to the left, stemming from the circle

你不是很清楚,所以我只是假设这条线从圆圈内开始,一直延伸到左端点。

在您的 AnimateLine() 函数中,您正在做的是在您希望线向左移动时将线缓慢地向右移动。

context.beginPath();
context.moveTo(lineDefaults.movePos.x, lineDefaults.movePos.y);
context.lineTo(lineDefaults.linePos.x, lineDefaults.linePos.y);
context.stroke();
context.closePath();

lineDefaults.linePos.x++; //here's what makes it go right

还有一个问题是你继续/终止画线的条件。

//i don't understand this condition
if (circleDefaults.currentPercent < lineDefaults.linePos.x) {
requestAnimationFrame(function () {
AnimateLine();
});
}

也许您正在尝试使用此条件来“同步”绘图或其他任何东西,但重点是,它不起作用并且没有意义。

这就是您的 AnimateLine() 函数应该发生的事情,以解决上述问题:

function AnimateLine() {
context.beginPath();
context.moveTo(lineDefaults.movePos.x, lineDefaults.movePos.y);
context.lineTo(lineDefaults.linePos.x, lineDefaults.linePos.y);
context.stroke();
context.closePath();

//see how i made this to decrements so that it will move to the left instead
lineDefaults.linePos.x--;

//adjust this to where you want the line to end
var end_of_line = 0;
if (lineDefaults.linePos.x > end_of_line) {
requestAnimationFrame(function () {
AnimateLine();
});
}
}

关于您的下一个问题:

only after the circle has completed its full animation

如果您熟悉回调,我使用了相同的概念。

if (circleDefaults.currentPercent < circleDefaults.endPercent) {
requestAnimationFrame(function () {
AnimateCircle(circleDefaults.currentPercent / 100);
});
}
//I added this part, since the condition above is the "while drawing" state,
// its negation, the else part, would be the "finished drawing" state
else{
AnimateLine();
}

提示:不要画一条线,然后在其上应用另一条线(但更长)来模拟动画,而是尝试绘制一点一点的线。从理论上讲,它会运行得更快。虽然在像这样的小动画中,这并不重要。哈哈。

关于javascript - 使用 HTML5 canvas 在另一个动画之后对一行进行动画处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23936629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com