From static SVG assets | See more examples in the showcasing app. | |
---|---|---|
|
||
Dynamically created from Path objects which are animated over time | ||
more coming soon ... |
The rendering library exposes a central widget called AnimatedDrawing
which allows to render SVG paths (via AnimatedDrawing.svg
) or Flutter Path objects (via AnimatedDrawing.paths
) in a drawing like fashion.
To get started with the drawing_animation
package you need a valid Svg file.
Currently only simple path elements without transforms are supported (see Supported SVG specifications)
pubspec.yaml
dependencies:
drawing_animation: ^1.0.1
2. **Add the SVG asset**
```yaml
assets:
- assets/my_drawing.svg
Use the widget
An AnimatedDrawing widget can be initiated in two ways:
Simplified - without animation controller (See Example_01)
By default every animation repeats infinitely. For running an animation only once you can use a callback to set run
to false after the first animation cycle completed (see field onFinish
).
AnimatedDrawing.svg(
"assets/my_drawing.svg",
run: this.run,
duration: new Duration(seconds: 3),
onFinish: () => setState(() {
this.run = false;
}),
)
Standard - with animation controller (See Example_02)
The simplified version will be sufficient in most of the use cases. If you wish to controll the animation furthermore or you want to syncronize it with other existing animations, you might consider using an custom animation controller:
AnimatedDrawing.svg(
"assets/test.svg",
controller: this.controller,
)
Check out examples in the examples
folder. It seems that antialising for the Paint/Canvas is switched off when using debug mode. For pretty results use flutter run --release
.
By providing Path objects directly to the widget, elements can be changed dynamically, even during the animation. The internal data structure is rebuild every time the state changes, therefore the animation performance might suffer if the amount of elements in paths
is very high (see Limitations). More examples will be provided soon (for now see Example_01 and Example_04).
AnimatedDrawing.paths(
[
///Path objects
],
paints:[
///Paint objects (optional), specifies a [Paint] object for each [Path] element in `paths`.
],
run: this.run,
duration: new Duration(seconds: 3),
onFinish: () => setState(() {
this.run = false;
}),
)
Current limitations:
As stated, for every state change of the widget, the internal data structure for the path objects is rebuilt. When the amount of provided path objects is high and a custom animationOrder
is defined (which triggers a sorting operation over the data structure) it can result in lags. This becomes especially apparent when the state is rebuild at 60fps by another animation (e.g. rotating the path objects at every frame). Any suggestions on how to elegantly solve this are very welcome :-)
Here is increasingly growing list with all available parameters and their visual effect.
Field | Type | Example |
---|---|---|
lineAnimation Specifies in which way the path elements are drawn to the canvas. When allAtOnce selected all path segments are drawn simultaneously. oneByOne paints every path segment one after another. |
LineAnimation.oneByOne |
|
LineAnimation.allAtOnce |
||
animationOrder Denotes the order in which the path elements are drawn to canvas when lineAnimation is set to LineAnimation.oneByOne . When no animationOrder is specified it defaults to the same order specified in the Svg asset or path array (PathOrder.original ). |
PathOrders.original |
|
PathOrders.bottomToTop |
||
PathOrders.decreasingLength |
||
PathOrders.increasingLength |
||
PathOrders.leftToRight |
||
PathOrders.rightToLeft |
||
PathOrders.topToBottom |
||
animationCurve Easing curves are used to adjust the rate of change of an animation over time, allowing them to speed up and slow down, rather than moving at a constant rate. See Flutter docs. |
Curves.linear |
|
Curves.elasticOut |
||
Curves.bounceInOut |
||
Curves.decelerate |
||
Other | ||
onFinish Callback when one animation cycle is finished. By default every animation repeats infinitely. |
||
onPaint Callback when a complete path is painted to the canvas. Returns with the relative index and the Path element itself. |
||
range Start and stop a animation from a certain moment in time by defining a AnimationRange object. |
||
scaleToViewport Path objects are scaled to the available viewport while maintaining the aspect ratio. Defaults to true. |
<path d="M3m1....">
) are supported for now. I'm currently considering to add flutter_svg as dependency for more complete SVG parsing.A lot of tools can convert existing SVG files to the supported format. For example with Inkscape:
Path>>Object to Path
and hit saveExample_01
: Set up simplfied AnimatedDrawing with AnimatedDrawing.svg and AnimatedDrawing.pathsExample_02
: Set up AnimatedDrawing with an custom animation controllerExample_03
: Small artistic showcasing app with vectorizied drawings of old book scans provided by the British LibraryExample_04
: Show how to create Gifs with high resolution using the debug
field.AnimatedDrawing.svg
- maybe also over paints
object?Thank you to maxwellito for his vivus project which served me as initial inspiration for this library. Thank you also to dnfield for the path_parsing library.
Credits to the British Library for their awesome collection of old book scans which I used for the showcasing app.