嗯,首先第一件事情:以優雅的動畫弧段,我們需要能夠以編程生成它們。考慮三角的這個笨拙位:
// arcPath:
// cx, cy are the center point
// inner_radius and outer_radius describe the distance of the arc segment's inner and outer boundaries from the center point.
// starting_radians describes the offset of the segment start;
// arc_radians describes the width of the arg segment.
function arcPath(cx, cy, inner_radius, outer_radius, starting_radians, arc_radians)
{
var x1 = cx + Math.cos(starting_radians) * inner_radius;
var y1 = cy + Math.sin(starting_radians) * inner_radius;
var x2 = cx + Math.cos(starting_radians) * outer_radius;
var y2 = cy + Math.sin(starting_radians) * outer_radius;
var x3 = cx + Math.cos(starting_radians + arc_radians) * outer_radius;
var y3 = cy + Math.sin(starting_radians + arc_radians) * outer_radius;
var x4 = cx + Math.cos(starting_radians + arc_radians) * inner_radius;
var y4 = cy + Math.sin(starting_radians + arc_radians) * inner_radius;
var pathstr = "M" + x1 + "," + y1 + " "
+ "L" + x2 + "," + y2 + " "
+ "A" + outer_radius + "," + outer_radius + " " + arc_radians + " " + (arc_radians > Math.PI ? "1" : "0") + " 1 " + x3 + "," + y3 + " "
+ "L" + x4 + "," + y4 + " "
+ "A" + inner_radius + "," + inner_radius + " " + (0 - arc_radians) + " " + (arc_radians > Math.PI ? "1" : "0") + " 0 " + x1 + "," + y1 + " z";
return pathstr;
}
用一個簡單的幾何構造,你可以簡單地動畫從局部弧段的路徑,全弧段,讓拉斐爾做提升,像這樣:
var arcPath1 = paper.path(arcPath(150, 150, 75, 125, Math.PI/2, Math.PI * 0.65))
.attr({ fill: "#003a60", 'fill-opacity': 0.5, stroke: 'black' });
arcPath1.click(function()
{
arcPath1.animate({ path: arcPath(150, 150, 75, 125, Math.PI/2, Math.PI * 2 - 0.0001) }, 2000, "<>");
});
不幸的是,拉斐爾在這方面做得非常糟糕,所以你會發生相交弧段的爆炸,將自己重塑成一個完整的圓圈,而不是所需的圓弧掃描。所以爲了讓它做你想做的事情,我們必須手動執行動畫。
function arcSweep(arc, x, y, inner, outer, angle_offset, from_sweep, to_sweep, duration)
{
var steps = 100;
var current_step = 0;
var intervalID = setInterval(function()
{
current_step++;
if (current_step >= steps)
clearInterval(intervalID);
arc.attr({ path: arcPath(x, y, inner, outer, angle_offset, from_sweep + ((to_sweep - from_sweep) * (current_step/steps))) });
}, duration/steps);
}
因此,基本上我們只是計算一系列中間弧,並依次設置它們直到達到目標角度。除了目標結束角度之外,動畫功能還需要弧的所有原始參數(它不能是Math.PI * 2 - 因爲它會計算爲空弧段!)。可能需要將這個抽象類抽象成一個類,以便弧段的每個實例都可以跟蹤它自己的變量。
這是fiddle演示成品。