【发布时间】:2015-02-01 11:00:55
【问题描述】:
我正在尝试使用 SVG 和 angular 指令创建一个图形来更改动态部分。现在我已经这样做了:
http://plnkr.co/edit/TcbK7kyzM3tapDISxndh?p=preview
app.directive('pieChart', function($document) {
return {
restrict: "E",
template: '<svg width="500" height="500">' +
'<path d="M100,200 a150,150 0 1,0 150,-150" stroke="black" stroke-width="10" fill="none"></path>' +
'</svg>',
scope: {
value: '='
},
link: function(scope, elem, attr) {
}
}
});
我希望我的图表在值为 100% 时看起来像这样,当值为 - 比如说 - 45% 时,我希望看到这条线,但距离顶部中心只有 45% 的长度.我可能需要重新计算路径的路径值,但我想问,当我用 JS 更改路径以使其在更改大小时具有动画效果时,是否有可能?
提前感谢您,或者如果您知道有关此内容的好教程,请将其链接给我。
编辑:我将指令更改为一个简单的条形图,但这只是举例,我知道这可以在没有 SVG 的情况下完成,因为您可以使用 div 来制作它,但我希望之后的图表更复杂。
这是一个 jsfiddle http://jsfiddle.net/fg9e7eo4/1/
在我的例子中,图表一直在动画,我想让它只动画一次,而不是停留在那个点。
顺便说一句,这是我正在尝试使其工作的指令:
testApp.directive('pieChart', function() {
var html =
'<svg width="510" height="20" style="background: #fff">' +
'<path d="{{path}}" stroke="red" stroke-width="10" fill="none">' +
'<animate dur="1s" repeatCount="indefinite" attributeName="d" values="{{path2}}"/>' +
'</path>' +
'</svg>';
return {
restrict: 'E',
template: html,
scope: {
'value': '='
},
link: function(scope, elem, attrs) {
scope.$watch('value', function(newValue, oldValue) {
scope.path = 'M 5 10, L ' + (newValue * 5) + ' 10';
scope.path2 = 'M 5 10, L ' + (oldValue * 5) + ' 10; M 5 10, L ' + (newValue * 5) + ' 10';
elem.children().children().beginElement();
});
}
};
});
【问题讨论】:
-
你需要$observe attr的值
-
我得到了由我在指令中调用的范围更新的值,但我不知道何时更改模板内的路径,如何将路径从最后一个 'd' 动画化到新的
-
您基本上必须使用一些缓动函数来修改路径。有一些框架(如 snap 或 d3)可以为您做到这一点 - here 是使用 d3 的示例。
-
我知道你也可以用一种叫做 SMIL 的东西来做动画。没有 js 可以做吗?
标签: angularjs svg angularjs-directive