mad*_*ear 4 javascript raphael pie-chart
我正在制作一个随时间显示结果的饼图.因此,它需要在状态之间设置动画以显示不同切片的变化.我已经想出如何整体更改所有切片(使用此示例作为起点),但我希望能够一次选择和管理特定切片(或Raphael称之为扇区).有没有人想出怎么做?我发现如果var pie是我的饼图,那么我可以得到一个特定的切片:
var pie = r.g.piechart(200, 200, 150, dataArray);
slice = pie.series[0];
Run Code Online (Sandbox Code Playgroud)
但是当我尝试用动画(特别是改变它的大小)来改变切片时,那就失败了(段不是正确的方法?):
slice.animate({segment: [200, 200, 0, 100]}, 800);
Run Code Online (Sandbox Code Playgroud)
任何操纵单个切片的见解都会非常有用.
我很尴尬地意识到,segment属性是一个自定义属性,我在一个例子中创建并使用它来更新饼图切片的路径,从而更新它的大小.它看起来像这样:
var r = Raphael("holder");
r.customAttributes.segment = function (x, y, r, a1, a2) {
var flag = (a2 - a1) > 180,
clr = (a2 - a1) / 360;
a1 = (a1 % 360) * Math.PI / 180;
a2 = (a2 % 360) * Math.PI / 180;
return {
path: [["M", x, y], ["l", r * Math.cos(a1), r * Math.sin(a1)], ["A", r, r, 0, +flag, 1, x + r * Math.cos(a2), y + r * Math.sin(a2)], ["z"]],
fill: "hsb(" + clr + ", .75, .8)"
};
};
Run Code Online (Sandbox Code Playgroud)
这是在上下文中看起来的样子:我有三个值[10,20,15]总共为45.假设一个宽度和高度为250的圆,我可以使用像这样的段自定义属性用切片填充圆圈(假设我的页面上有一个带有持有者ID的div):
var r = Raphael("holder");
r.customAttributes.segment = function (x, y, r, a1, a2) {
var flag = (a2 - a1) > 180,
clr = (a2 - a1) / 360;
a1 = (a1 % 360) * Math.PI / 180;
a2 = (a2 % 360) * Math.PI / 180;
return {
path: [["M", x, y], ["l", r * Math.cos(a1), r * Math.sin(a1)], ["A", r, r, 0, +flag, 1, x + r * Math.cos(a2), y + r * Math.sin(a2)], ["z"]],
fill: "hsb(" + clr + ", .75, .8)"
};
};
points = [10, 20, 15];
total = 45;
start = 0;
paths = [];
for(i=0; i<=2; i++) {
size = 360 / total * points[i];
var slice = r.path();
slice.attr({segment: [250, 250, 200, start, start + size], stroke: "#000", title: "Slice "+i});
paths.push(slice);
start += size;
}
Run Code Online (Sandbox Code Playgroud)
然后,我可以通过设置段属性的动画来随时为我的路径数组中的切片设置动画:
newPoints = [5, 20, 20];
start = 0;
for(i=0; i<=2; i++) {
size = 360 / total * newPoints[i];
paths[i].animate({segment: [250, 250, 200, start, start + size]}, 800);
paths[i].angle = start - size / 2;
start += size;
}
Run Code Online (Sandbox Code Playgroud)
其中一些我理解,其中一些我没有.但上面的代码将起作用(我检查过).