4

我正在制作一个饼图,显示一段时间内的结果。因此,它需要在状态之间进行动画处理以显示不同的切片如何变化。我已经弄清楚如何整体更改所有切片(使用此示例作为起点),但我希望能够一次选择和管理特定切片(或拉斐尔所说的扇区)。有没有人想出如何做到这一点?我发现如果 var pie 是我的饼图,那么我可以得到一个特定的切片:

var pie = r.g.piechart(200, 200, 150, dataArray);
slice = pie.series[0];

但是当我尝试用一​​个动画(特别是改变它的大小)来改变切片时,它失败了(段不是正确的方法?):

slice.animate({segment: [200, 200, 0, 100]}, 800);

对操纵单个切片的任何见解都会非常有帮助。

4

1 回答 1

7

我很尴尬地意识到,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)"
      };
  };

这是在上下文中的样子:我有三个值 [10, 20, 15],总计为 45。假设一个宽度和高度为 250 的圆,我可以使用像这样的段自定义属性用切片填充圆(假设我的页面上有一个 div,其 id 为 holder):

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;
}

然后,我可以随时通过为段属性设置动画来为路径数组中的切片设置动画:

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;
}

有些我明白,有些我不明白。但是上面的代码可以工作(我检查过)。

于 2010-09-22T21:16:25.060 回答