我是D3JS的新手,我做了一个2弧的甜甜圈(我的数据只有两个值)。我试图弄清楚如何动画他们,使最大的路径得到“自我绘制”第一,然后最小的一个也得到自我绘制。
我知道这可以通过将起始Angular 设置为0来实现,然后使用D3js attrTween()并使用所需的最终Angular 进行播放。但由于我无法自己声明最终Angular ,它取决于数据,而且由于我对djse的了解非常少,我还无法实现它。
这是我的JS代码:
var width = 100,
height = 100,
radius = (Math.min(width, height) / 2);
function drawDonut(dataa, divchart) {
var sym = "%"
var color = ["#00338D", "#BC204B"];
var pie = d3.pie()
.value(function(d) {
return d
})(dataa);
var arc = d3.arc()
.outerRadius(radius - 10)
.innerRadius(radius - (radius / 1.9));
var labelArc = d3.arc()
.outerRadius(radius - 31)
.innerRadius(radius - 31);
var svg = d3.select(divchart)
.append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + 50 + "," + 50 + ")");
var g = svg.selectAll("arc")
.data(pie)
.enter().append("g")
.attr("class", "arc");
g.append("path")
.attr("d", arc)
.data(color)
.style("fill", function(d) {
return d
});
g.append("g")
.attr("transform", "translate(-17,-17) scale(0.7)")
.html(myGroup);
}
2条答案
按热度按时间50pmv0ei1#
使用来自previous post和attrTween的数据作为参考,下面是一个应用了大路径优先动画的代码片段
第一个
相关变更:
1.对路径使用上述方法,沿着在过渡中使用延迟,顺便说一句,延迟用于按顺序动画化路径。
1.按降序对数据进行排序,以首先绘制最大的弧。
w9apscun2#
根据Shashank的回答,我想提出一个修改
data
进行排序,因为顺序看起来很重要(d[0] == man,d[1] == woman),并且弧线是按顺序着色的easeCubic
制作动画,每个部分(小或大)需要800 ms。要获得恒定角速度动画,我们必须根据部分的startAngle
和endAngle
设置延迟和持续时间。过渡必须设置为easeLinear
。在演示中,我将完整动画设置为5000 ms。使用线性缓动的示例
第一个
如果你想用
easeCubic
来完成完整的Angular 动画,这需要更多的数学运算。主要原因是两个弧段都是独立的过渡。这应该适用于2个以上的弧段。它只适用于单调递增缓动函数,不适用于反弹、弹性和返回(进/出)等函数。
完整圆形Angular 的“立方”缓动示例。
第一个