プログレッシブ パス
徐々にパスを描くのは簡単です。この質問に対する 2 番目に受け入れられている回答は嫌いです。これは、すべてのステップでパスを再作成し、その間の紙をクリアするためです。これが私が何度も何度も使用したユーティリティ関数です。
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;
}
あなたは私のサイトで実際にそれを見ることができます.
これだけで、ポイントのプログレッシブ パスの構築を直線的にアニメートすることが非常に簡単になります。パスをコンパイルするだけです...
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
} );
カーブ補間
Raphael 2.0 の Catmull Rom 機能により、ポイント間を優雅にカーブさせることが非常に簡単になります (これを指摘してくれた Erik Dahlström に感謝します)。「R」コマンドを使用してポイント間を移動するパスを作成するだけで、後は Raphael が行います。
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;
}
すべての部品が連携して動作している様子をここで見ることができます。