漸進路徑
逐步繪製路徑是很容易做到。我不喜歡this question上第二個最被接受的答案,因爲它在每一步都重新創建一條路徑,清理之間的紙張。這裏,我再次使用的時間和時間的實用功能:
function drawpath(canvas, pathstr, duration, attr, callback)
{
var guide_path = canvas.path(pathstr).attr({ stroke: "none", fill: "none" });
var path = canvas.path(guide_path.getSubpath(0, 1)).attr(attr);
var total_length = guide_path.getTotalLength(guide_path);
var last_point = guide_path.getPointAtLength(0);
var start_time = new Date().getTime();
var interval_length = 50;
var result = path;
var interval_id = setInterval(function()
{
var elapsed_time = new Date().getTime() - start_time;
var this_length = elapsed_time/duration * total_length;
var subpathstr = guide_path.getSubpath(0, this_length);
attr.path = subpathstr;
path.animate(attr, interval_length);
if (elapsed_time >= duration)
{
clearInterval(interval_id);
if (callback != undefined) callback();
guide_path.remove();
}
}, interval_length);
return result;
}
你可以看到它在行動on my site。
僅憑這一點就可以使您的點的漸進路徑構造以線性方式動畫化,非常簡單。你只需編譯你的路徑...
var sequence_path = ["M26,-6", "L14,-12", "L5,-20", "L11,-28", "L14,-37", "L5,-40"];
然後將它傳遞給你設置的任何路徑動畫函數。就我而言,
drawpath(paper,
sequence_path,
3500,
{ stroke: 'black', 'stroke-width': 2, 'stroke-opacity': 1, fill: 'none', 'fill-opacity': 0 },
function()
{
alert("All done"); // trigger whatever you want here
});
曲線插補
拉斐爾2.0的卡特莫爾羅功能,使您的點之間優雅地彎曲非常簡單(感謝埃裏克·達爾斯特羅姆指出這一點)。所有你需要做的就是使用'R'命令來建立一個路徑在點之間移動,而拉斐爾將完成剩下的工作。
function generateInterpolatedPath(points)
{
var path_sequence = [];
path_sequence.push("M", points[0].x, points[0].y);
path_sequence.push("R");
for (var i = 1; i < points.length; i++)
{
path_sequence.push(points[i].x, points[i].y);
}
return path_sequence;
}
你可以看到所有的作品一起here工作。
非常感謝你! –
謝謝_you_。插值問題是一個偉大的大腦預告=) –
@KevinNielsen,我一直在使用這個,但我剛剛注意到,它運行速度比預期的Firefox。我有4分的路徑,如果我將它設置爲2秒(或更多),則需要的時間少於此時間。 – Jayen