Progressive Ścieżki
Rysowanie ścieżki stopniowo jest łatwe do zrobienia. Nie podoba mi się druga najbardziej akceptowana odpowiedź na this question, ponieważ odtwarza ścieżkę na każdym kroku, usuwając papier pomiędzy. Oto funkcja użyteczności Użyłem raz po raz:
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;
}
Można zobaczyć go w akcji on my site.
Ta sama stałaby animowanie budowie progresywnej ścieżka do punktów liniowo absolutnie proste. Po prostu skompiluj swoją ścieżkę ...
var sequence_path = ["M26,-6", "L14,-12", "L5,-20", "L11,-28", "L14,-37", "L5,-40"];
A następnie przekaż ją do dowolnej skonfigurowanej funkcji animacji ścieżki. W moim przypadku,
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
});
Curve interpolacja
Raphael 2,0 za Catmull Rz cecha sprawia, wijąca wdzięcznie między swoimi punktami niezwykle proste (dzięki Erik Dahlström za wskazanie na to uwagę). Wszystko, co musisz zrobić, to skonstruować ścieżkę za pomocą polecenia "R", aby poruszać się pomiędzy punktami, a Rafael wykona resztę.
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;
}
Możesz zobaczyć wszystkie elementy pracujące razem here.
bardzo dziękuję! –
Dziękuję _you_.Problem interpolacji był świetnym łamigłówkiem =) –
@KevinNielsen, Używałem tego, ale zauważyłem, że działa szybciej niż oczekiwano w Firefoksie. Mam ścieżkę 4 punktów i jeśli ustawię ją na 2 sekundy (lub więcej), zajmuje to mniej czasu. – Jayen