我正在构建一个可以在地图上绘制标记的应用程序 - 并且可以从标记中平滑地设置闹铃动画。
标记将具有以下属性
如果警报等级很低 - 我希望戒指能够非常缓慢地砰地跳动,如果它的高音更快,可能会更快地跳出来。
这将在某个时刻用于约会应用程序,因此警报评级将代表人们迫切希望找到另一个人约会。如果地图落在用户当前位置并且紧急用户的响铃进入视野,那就太好了。
这是最新的小提琴,http://jsfiddle.net/NYEaX/367/
这就是我的目标 - http://demo.joostkiens.com/het-parool-4g/
function makeRings() {
var datapoints = circleGroup.selectAll("circle");
var radius = 1;
function myTransition(circleData){
var transition = d3.select(this).transition();
speedLineGroup.append("circle")
.attr({
"class": "ring",
"fill":"red",
"stroke":"red",
"cx": circleData.xcoord,
"cy": circleData.ycoord,
"r":radius,
"opacity": 0.4,
"fill-opacity":0.1
})
.transition()
.duration(function(){
return 100*circleData.alarmLevel;
})
.attr("r", radius + 100 )
.attr("opacity", 0)
.remove();
transition.each('end', myTransition);
}
datapoints.each(myTransition);
}
答案 0 :(得分:0)
以下是一些可能有用的代码/概念
window.setInterval(makeRings, 1000);
function makeRings() {
datapoints.each(function(circleData){
//datapoints is your d3 selection of circle elements
speedLineGroup.append("circle")
.attr({"class": "ring",
"fill":"red", //or use CSS to set fill and stroke styles
"stroke":"red",
"cx": circleData.xCoord,
"cy": circleData.yCoord,
//position according to this circle's position
"r":radius, //starting radius,
//set according to the radius used for data points
"opacity": 0.8, //starting opacity
"fill-opacity":0.5 //fill will always be half of the overall opacity
})
.transition()
.duration( intensityTimeScale(circleData.intensity) )
//Use an appropriate linear scale to set the time it takes for
//the circles to expand to their maximum radius.
//Note that you *don't* use function(d){}, since we're using the data
//passed to the .each function from the data point, not data
//attached to the ring
.attr("r", radius + intensityRadiusScale(circleData.intensity) )
//transition radius
//again, create an appropriate linear scale
.attr("opacity", 0) //transition opacity
.remove(); //remove when transition is complete
});
}
function myTransition(d){
var transition = d3.select(this).transition();
//Forward transition behavior goes here
//Probably create a new circle, expand all circles, fade out last circle
transition.each('end', myTransition); //This calls the backward transition
}
d3.select('myFlashingElement').each(myTransition);
使用'setInterval'定期调用函数(例如,一次 或者每秒两次)将围绕每个数据创建一个新的环 圈。
在数据圈上使用.each()调用创建响铃,但添加 它们是不同的元素,和/或不同的类名 所以环和数据点之间没有混淆。
将环的初始半径设置为与数据点相同, 但随后立即开始转型。使持续时间 转换是“强度”数据值的函数 关联数据圈,也使最终半径成为函数 那个数据值。同时将不透明度转换为值0。
为戒指.remove()做过渡的最后一行 每个环在完成扩展后自行移除。
在d3中创建循环转换是在转换时使用结束回调。创建两个函数,每个函数创建一个数据转换,一个从起点到终点,另一个返回,让它们在完成时相互调用,如下所示:
答案 1 :(得分:0)
这似乎与这个例子非常匹配。 http://jsfiddle.net/NYEaX/468/
以下是我使用的设置。
function getDurationPerDot(circleData){
var totalTime = 3000;//3 seconds max
var time = totalTime-(circleData.alarmLevel*10)
return time;
}
function getOuterRadiusPerDot(circleData){
var radius = circleData.alarmLevel*.5;
return radius;
}