I am trying to create a graph using SVG and angular directive to change the dynamic parts. Right now I've done this:
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) {
}
}
});
I want my graph to look like this when it's 100% value, and when the value is -- let's say -- 45%, I would like to see this line but with only 45% of it's length from the top center. I probably have to re-calculate the path value of the path but I wanted to ask, is it possible when I change the path with JS to make it animate while it's changing the size?
Thank you in advance, or if any of you know a good tutorial on this stuff please link it to me.
EDIT: I changed the directive to a simple bar graph but this is just for example, I know this can be done without SVG since you can make it using divs but i want the chart to be more complex after.
Here's a jsfiddle http://jsfiddle.net/fg9e7eo4/1/
In my example, the chart keeps animating and I would like to make it animate only once and than remain at that point.
By the way, this is the directive that I'm trying out to make it work:
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();
});
}
};
});
SVG supports the ability to change vector graphics over time, to create animated effects. SVG content can be animated in the following ways: Using SVG's animation elements [svg-animation]. SVG document fragments can describe time-based modifications to the document's elements.
SVG Animation Using CSS: Core Concepts Fortunately, it's similar to HTML: We define SVG elements with XML syntax and style them with CSS, just as if they were HTML. SVG elements are purposely built for drawing graphics. We can use <rect> for drawing a rectangle, <circle> for drawing circles, etc.
If you want to use bar chart, why don't you use rect instead of path?
IMO, rect is more descriptive than path.
Here is my example to use rect to animate it.
http://plnkr.co/edit/2hEzBqIVgh0rgE3D0Pd4?p=preview
For AngularJS, you simply set width and to attribute.
<rect x="10" y="10" height="110" width="500"
style="stroke:#ff0000; fill: #0000ff">
<animate
attributeName="width"
begin="0s"
dur="2s"
from="0"
to="500"
/>
</rect>
This answer is also helpful, I think.
SMIL animation on SVG ng-repeat'ed element only occurs on page load
If you want it to animate only once and then stop replace repeatCount="indefinite" by repeatCount="1" fill="freeze"
If you make sure the paths in the values are consistent in the numbers and types of command you should get smooth animation. Here's an example:
<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500">
<path d="M100,200 L150,200" stroke="black" stroke-width="10" fill="none">
<animate attributeName="d" values="M100,200 L150,200;M100,200 L200, 200" fill="freeze" begin="1s" dur="2s" />
</path>
</svg>
The SVG testsuite has an example of path animation. and there's a w3c primer on animation.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With