Compare commits

..

1 Commits

Author SHA1 Message Date
2443bec3af Hypothetical fix for #243 2022-12-13 13:42:21 +01:00
106 changed files with 634 additions and 10103 deletions

View File

@ -1,33 +1,4 @@
## 2.3.0
- Fixed a failed assertion (`dirty: is not true`) when calling `setState` inside `onLoaded` callback.
- Update point text y offset
- Makes static compositions not animate by default
## 2.2.0
Apply the latest fixes from Lottie-Android:
- Overhaul text layout
- Fix rounded corners modifying already rounded corners
- Support box position in Document Data
- Allow interpolating between gradients with different opacity stops
- Add support for gradient opacity stops
## 2.1.0
- Improve the cache to ensure that there is not an empty frame each time we load an animation.
The method `AssetLottie('anim.json').load()` returns a `SynchronousFuture` if it has been loaded previously.
- Expose the `LottieCache` singleton.
It allows to change the cache behaviour and clear the entries.
```dart
void main() {
Lottie.cache.maximumSize = 10;
Lottie.cache.clear();
Lottie.cache.evict(NetworkLottie('https://lottie.com/anim.json'));
}
```
## 2.0.0
## [2.0.0]
- **Breaking change**: the lottie widget will be smaller if it relies on the intrinsic size of the composition.
Previously the lottie parser was automatically multiplying the size of the composition by `window.devicePixelRatio`.
@ -49,19 +20,19 @@ Scaffold(
);
```
## 1.4.3
## [1.4.3]
- Fixed some lints with Flutter 3.3.
## 1.4.2
## [1.4.2]
- Use `FilterQuality.low` as default to draw image layers.
## 1.4.1
## [1.4.1]
- Allow `AlignmentGeometry` for `alignment`.
## 1.4.0
## [1.4.0]
- Added `filterQuality` property to control the performance vs quality trade-off to use when drawing images
## 1.3.0
## [1.3.0]
- Added support for rounded corners on shapes and rects
- Add support for text in dynamic properties (`ValueDelegate`)
@ -83,13 +54,13 @@ Lottie.asset(
- Add support for reversed polystar paths
- Enforce order of operations to avoid rounding errors
## 1.2.2
## [1.2.2]
- Internal maintenance: fix lints for Flutter 2.10
## 1.2.1
## [1.2.1]
- Fix: Revert Cubic to `PathInterpolator.cubic`
## 1.2.0
## [1.2.0]
- Add support for gaussian blurs.
Example to blur some elements dynamically:
@ -126,7 +97,7 @@ Lottie.asset(
)
```
## 1.1.0
## [1.1.0]
- Add `errorBuilder` callback to provide an alternative widget in case an error occurs during loading.
```dart
Lottie.network(
@ -148,25 +119,25 @@ Lottie.network(
```
- Various bug fixes
## 1.0.1
## [1.0.1]
- Implement `RenderBox.computeDryLayout`
## 1.0.0
## [1.0.0]
- Migrate to null safety
- Fix some rendering bugs
- Add an image delegate to dynamically change images
- Allow to use an imageProviderFactory with a zip file
## 0.7.1
## [0.7.1]
- Fix a crash for some lottie file with empty paths.
## 0.7.0+1
## [0.7.0+1]
- Fix Flutter Web compilation error
## 0.7.0
## [0.7.0]
- Performance improvement for complex animations.
## 0.6.0
## [0.6.0]
- Runs the animation at the frame rate specified in the json file (ie. An animation encoded with a 20 FPS will only
be paint 20 times per seconds even though the AnimationController will invalidate the widget 60 times per seconds).
A new property `frameRate` allows to opt-out this behavior and have the widget to repaint at the device frame rate
@ -177,20 +148,20 @@ Lottie.network(
- Fix a bug where we would call `markNeedPaint` when the animation was not changing. This removes unnecessary paints in
animations with static periods.
## 0.5.1
## [0.5.1]
- Remove direct dependencies on dart:io to support Flutter Web
## 0.5.0
## [0.5.0]
- Support loading animation from network in a web app
- Fix a couple of bugs with the web dev compiler
## 0.4.1
## [0.4.1]
- Support color value stored as RGB, not RGBA
## 0.4.0+1
## [0.4.0+1]
- Support latest version of the `characters` package
## 0.4.0
## [0.4.0]
- Disable "Merge paths" by default and provide an option to enable them.
This is the same behavior as in Lottie-android.
Merge paths currently don't work if the the operand shape is entirely contained within the
@ -203,62 +174,62 @@ Lottie.asset('file.json', options: LottieOptions(enableMergePaths: true));
```
## 0.3.6
## [0.3.6]
- Export the `Marker` class
## 0.3.5
## [0.3.5]
- Fix a bug with a wrongly clipped rectangle.
## 0.3.4
## [0.3.4]
- Fix a bug with dashed path
## 0.3.3
## [0.3.3]
- Fix a bug with rounded rectangle shape
## 0.3.2
## [0.3.2]
- Fix a bug with "repeater" content
## 0.3.1
## [0.3.1]
- Support dashed path
## 0.3.0+1
## [0.3.0+1]
- Specify a version range for the dependency on `characters`.
## 0.3.0
## [0.3.0]
- Add `LottieDelegates` a group of options to customize the lottie animation at runtime.
ie: Dynamically modify color, position, size, text... of every elements of the animation.
- Correctly display Linear and Radial Gradients
- Integrate latest changes from Lottie-android
## 0.2.2
## [0.2.2]
- Add a [repeat] parameter to specify if the automatic animation should loop.
- Add the [animate], [reverse], [repeat] properties on `LottieBuilder`
- Fix bug with `onLoaded` callback when the `LottieProvider` is changed
## 0.2.1
## [0.2.1]
- Fix a big bug in the path transformation code. A lot more animations look correct now.
## 0.2.0+1
## [0.2.0+1]
- Improve readme
- (internal) Add golden tests
## 0.2.0
## [0.2.0]
- Support loading the animation and its images from a zip file
- Breaking: `LottieComposition.fromBytes` and `fromByteData` are now asynchronous.
## 0.1.4
## [0.1.4]
- Support images in animation
- Basic support for text in animation (work in progress)
## 0.1.3
## [0.1.3]
- Support Polystar shape
- Reorganize examples.
## 0.1.2
## [0.1.2]
- Implement `Lottie.network`, `Lottie.file` and `Lottie.memory`
## 0.1.1
## [0.1.1]
- Fix analysis lints
## 0.1.0
## [0.1.0]
- Initial conversion of [lottie-android](https://github.com/airbnb/lottie-android) to Dart/Flutter

View File

@ -129,7 +129,8 @@ animation.
The `Lottie` widget has several convenient constructors (`Lottie.asset`, `Lottie.network`, `Lottie.memory`) to load, parse and
cache automatically the json file.
Sometime you may prefer to have full control over the loading of the file. Use `AssetLottie` (or `NetworkLottie`, `MemoryLottie`) to load a lottie composition from a json file.
Sometime you may prefer to have full control over the loading of the file. Use `LottieComposition.fromByteData` to
parse the file from a list of bytes.
This example shows how to load and parse a Lottie composition from a json file.
@ -148,7 +149,12 @@ class _MyWidgetState extends State<MyWidget> {
void initState() {
super.initState();
_composition = AssetLottie('assets/LottieLogo1.json').load();
_composition = _loadComposition();
}
Future<LottieComposition> _loadComposition() async {
var assetData = await rootBundle.load('assets/LottieLogo1.json');
return await LottieComposition.fromByteData(assetData);
}
@override

View File

@ -51,7 +51,8 @@ animation.
The `Lottie` widget has several convenient constructors (`Lottie.asset`, `Lottie.network`, `Lottie.memory`) to load, parse and
cache automatically the json file.
Sometime you may prefer to have full control over the loading of the file. Use `AssetLottie` (or `NetworkLottie`, `MemoryLottie`) to load a lottie composition from a json file.
Sometime you may prefer to have full control over the loading of the file. Use `LottieComposition.fromByteData` to
parse the file from a list of bytes.
This example shows how to load and parse a Lottie composition from a json file.

View File

@ -10,7 +10,6 @@ linter:
always_declare_return_types: true
avoid_dynamic_calls: true
avoid_escaping_inner_quotes: true
avoid_final_parameters: true
avoid_returning_null_for_future: true
avoid_setters_without_getters: true
cancel_subscriptions: true

View File

@ -1 +0,0 @@
{"v":"5.8.2","fr":23.9759979248047,"ip":0,"op":71.9999937681822,"w":400,"h":400,"nm":"BeyondBounds","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[510.547,510.547],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":71.9999937681822,"st":0,"bm":0}],"markers":[]}

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
{"v":"5.9.6","fr":3,"ip":0,"op":3,"w":200,"h":200,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[30,30,0],"to":[21.667,21.667,0],"ti":[-21.667,-21.667,0]},{"t":2,"s":[160,160,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[58.742,58.742],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3,"st":0,"ct":1,"bm":0}],"markers":[]}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -1 +0,0 @@
{"v":"5.8.1","fr":25,"ip":0,"op":2,"w":2000,"h":4000,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1000,2000,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[1554.562,597.062],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.220496237278,1,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.281,-21.469],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[1780.188,3801.75],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.116727701823,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.094,12.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":1,"nm":"Red Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1000,2000,0],"ix":2,"l":2},"a":{"a":0,"k":[1000,2000,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":2000,"sh":4000,"sc":"#ff0000","ip":0,"op":2,"st":0,"bm":0}],"markers":[]}

File diff suppressed because one or more lines are too long

View File

@ -1,494 +0,0 @@
{
"tgs": 1,
"v": "5.5.2",
"fr": 60,
"ip": 0,
"op": 180,
"w": 512,
"h": 512,
"nm": "02_ricl_klass - 3:00",
"ddd": 0,
"assets": [],
"layers": [
{
"ddd": 0,
"ind": 6,
"ty": 4,
"parent": 5,
"sr": 1,
"ks": {
"o": {
"a": 1,
"k": [
{
"i": {
"x": [
0.833
],
"y": [
0.833
]
},
"o": {
"x": [
0.167
],
"y": [
0.167
]
},
"t": -105,
"s": [
0
]
},
{
"i": {
"x": [
0.833
],
"y": [
0.833
]
},
"o": {
"x": [
0.167
],
"y": [
0.167
]
},
"t": -104,
"s": [
100
]
},
{
"i": {
"x": [
0.833
],
"y": [
0.833
]
},
"o": {
"x": [
0.167
],
"y": [
0.167
]
},
"t": 34,
"s": [
100
]
},
{
"i": {
"x": [
0.833
],
"y": [
0.833
]
},
"o": {
"x": [
0.167
],
"y": [
0.167
]
},
"t": 35,
"s": [
0
]
},
{
"i": {
"x": [
0.833
],
"y": [
0.833
]
},
"o": {
"x": [
0.167
],
"y": [
0.167
]
},
"t": 75,
"s": [
0
]
},
{
"i": {
"x": [
0.833
],
"y": [
0.833
]
},
"o": {
"x": [
0.167
],
"y": [
0.167
]
},
"t": 76,
"s": [
100
]
},
{
"i": {
"x": [
0.833
],
"y": [
0.833
]
},
"o": {
"x": [
0.167
],
"y": [
0.167
]
},
"t": 214,
"s": [
100
]
},
{
"t": 215,
"s": [
0
]
}
]
},
"p": {
"a": 0,
"k": [
0,
-0.031,
0
]
},
"a": {
"a": 0,
"k": [
-87,
-18.182,
0
]
},
"s": {
"a": 0,
"k": [
50,
33,
100
]
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ind": 0,
"ty": "sh",
"ks": {
"a": 1,
"k": [
{
"i": {
"x": 0.833,
"y": 0.833
},
"o": {
"x": 0.167,
"y": 0.167
},
"t": 213,
"s": [
{
"i": [
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
],
"v": [
[
571.25,
-298.22
],
[
-192.5,
-267.902
],
[
-182.875,
510.152
],
[
575.125,
547.848
]
],
"c": true
}
]
},
{
"t": 214,
"s": [
{
"i": [
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
],
"v": [
[
122.25,
-242.159
],
[
-192.5,
-267.902
],
[
-181.875,
178.333
],
[
175.125,
141.788
]
],
"c": true
}
]
}
]
},
"hd": false
},
{
"ty": "gf",
"o": {
"a": 0,
"k": 100
},
"r": 1,
"bm": 0,
"g": {
"p": 5,
"k": {
"a": 0,
"k": [
0.832,
0.275,
0.89,
0.086,
0.86,
0.275,
0.89,
0.086,
0.887,
0.275,
0.89,
0.086,
0.944,
0.275,
0.89,
0.086,
1,
0.275,
0.89,
0.086,
0.65,
0,
0.785,
0.5,
0.84,
1,
0.862,
1,
0.885,
1,
0.896,
0.5,
0.908,
0
]
}
},
"s": {
"a": 0,
"k": [
457.898,
-71.143
]
},
"e": {
"a": 0,
"k": [
-182.411,
-47.941
]
},
"t": 2,
"h": {
"a": 0,
"k": 0
},
"a": {
"a": 0,
"k": 97.679
},
"hd": false
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
]
},
"a": {
"a": 0,
"k": [
0,
0
]
},
"s": {
"a": 0,
"k": [
100,
100
]
},
"r": {
"a": 0,
"k": 0
},
"o": {
"a": 0,
"k": 100
},
"sk": {
"a": 0,
"k": 0
},
"sa": {
"a": 0,
"k": 0
}
}
],
"bm": 0,
"hd": false
}
],
"ip": 0,
"op": 180,
"st": -120,
"bm": 0
}
]
}

File diff suppressed because one or more lines are too long

View File

@ -1,386 +0,0 @@
{
"v": "5.9.1",
"fr": 60,
"ip": 0,
"op": 56,
"w": 1080,
"h": 1080,
"nm": "Warning",
"ddd": 0,
"assets": [
{
"id": "comp_0",
"nm": "Warning_2",
"fr": 60,
"layers": [
{
"ddd": 0,
"ind": 3,
"ty": 4,
"nm": "CERCHIO contorni",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 0,
"k": [
24.5,
24.5,
0
],
"ix": 2,
"l": 2
},
"a": {
"a": 0,
"k": [
29.5,
29.5,
0
],
"ix": 1,
"l": 2
},
"s": {
"a": 0,
"k": [
100,
100,
100
],
"ix": 6,
"l": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ind": 0,
"ty": "sh",
"ix": 1,
"ks": {
"a": 0,
"k": {
"i": [
[
-12.15,
0
],
[
0,
-12.15
],
[
12.15,
0
],
[
0,
12.15
]
],
"o": [
[
12.15,
0
],
[
0,
12.15
],
[
-12.15,
0
],
[
0,
-12.15
]
],
"v": [
[
0,
-22
],
[
22,
0
],
[
0,
22
],
[
-22,
0
]
],
"c": true
},
"ix": 2
},
"nm": "Tracciato 1",
"mn": "ADBE Vector Shape - Group",
"hd": false
},
{
"ty": "st",
"c": {
"a": 0,
"k": [
0.956862804936,
0.290196078431,
0.239215701234,
1
],
"ix": 3
},
"o": {
"a": 0,
"k": 100,
"ix": 4
},
"w": {
"a": 0,
"k": 3,
"ix": 5
},
"lc": 2,
"lj": 2,
"bm": 0,
"nm": "Traccia 1",
"mn": "ADBE Vector Graphic - Stroke",
"hd": false
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
29.5,
29.5
],
"ix": 2
},
"a": {
"a": 0,
"k": [
0,
0
],
"ix": 1
},
"s": {
"a": 0,
"k": [
100,
100
],
"ix": 3
},
"r": {
"a": 0,
"k": 0,
"ix": 6
},
"o": {
"a": 0,
"k": 100,
"ix": 7
},
"sk": {
"a": 0,
"k": 0,
"ix": 4
},
"sa": {
"a": 0,
"k": 0,
"ix": 5
},
"nm": "Transform"
}
],
"nm": "Gruppo 1",
"np": 2,
"cix": 2,
"bm": 0,
"ix": 1,
"mn": "ADBE Vector Group",
"hd": false
},
{
"ty": "tm",
"s": {
"a": 1,
"k": [
{
"i": {
"x": [
0.833
],
"y": [
0.833
]
},
"o": {
"x": [
0.167
],
"y": [
0.167
]
},
"t": 0,
"s": [
0
]
},
{
"t": 36,
"s": [
0
]
}
],
"ix": 1
},
"e": {
"a": 1,
"k": [
{
"i": {
"x": [
0.833
],
"y": [
0.833
]
},
"o": {
"x": [
0.167
],
"y": [
0.167
]
},
"t": 0,
"s": [
0
]
},
{
"t": 36,
"s": [
100
]
}
],
"ix": 2
},
"o": {
"a": 0,
"k": 0,
"ix": 3
},
"m": 1,
"ix": 2,
"nm": "Taglia tracciati 1",
"mn": "ADBE Vector Filter - Trim",
"hd": false
},
{
"ty": "rd",
"nm": "Angoli arrotondati 1",
"r": {
"a": 0,
"k": 10,
"ix": 1
},
"ix": 3,
"mn": "ADBE Vector Filter - RC",
"hd": false
}
],
"ip": 0,
"op": 57,
"st": 0,
"bm": 0
}
]
}
],
"layers": [
{
"ddd": 0,
"ind": 1,
"ty": 0,
"nm": "Warning_2",
"refId": "comp_0",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 0,
"k": [
530,
530,
0
],
"ix": 2,
"l": 2
},
"a": {
"a": 0,
"k": [
24,
24,
0
],
"ix": 1,
"l": 2
},
"s": {
"a": 0,
"k": [
2000,
2000,
100
],
"ix": 6,
"l": 2
}
},
"ao": 0,
"w": 48,
"h": 48,
"ip": 0,
"op": 57,
"st": 0,
"bm": 0
}
],
"markers": []
}

View File

@ -1 +0,0 @@
{"v":"5.7.4","fr":60,"ip":0,"op":63,"w":400,"h":400,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.984],"y":[0.777]},"o":{"x":[0.411],"y":[0.047]},"t":0,"s":[200]},{"t":62,"s":[460]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.926],"y":[0.943]},"o":{"x":[0.028],"y":[1.152]},"t":0,"s":[200]},{"t":62,"s":[460]}],"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[119.332,119.332],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-130.404,-126.932],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":63,"st":0,"bm":0}],"markers":[]}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1 +0,0 @@
{"v":"5.9.6","fr":29.9700012207031,"ip":0,"op":190.000007738859,"w":24,"h":24,"nm":"Thumb","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[12,12,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":5,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":5,"ix":6},"is":{"a":0,"k":0,"ix":8},"or":{"a":0,"k":12,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.922702133656,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Polystar 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":190.000007738859,"st":0,"ct":1,"bm":0}],"markers":[]}

View File

@ -1 +0,0 @@
{"v":"5.5.8","fr":60,"ip":0,"op":166,"w":828,"h":1215,"nm":"Залитые дуги 10 + opacity","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Sinie 2","td":1,"sr":1.53474205216067,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[413.199,607.88,0],"ix":2},"a":{"a":0,"k":[168.949,195.88,0],"ix":1},"s":{"a":0,"k":[207.219,207.219,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[11.998,6.913],[13.844,0.193],[-28.149,-0.401]],"o":[[-11.991,-6.921],[14.447,24.162],[-7.102,-11.886]],"v":[[5.137,-8.915],[-34.263,-19.764],[34.265,19.754]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-14.745,-25.464],[0.311,-0.18],[0.113,0],[14.745,25.466],[-0.31,0.179],[-0.114,0]],"o":[[29.425,0.007],[0.178,0.311],[-0.098,0.056],[-29.427,-0.005],[-0.179,-0.31],[0.099,-0.057],[0,0]],"v":[[-35.4,-21.063],[35.964,20.09],[35.725,20.977],[35.403,21.063],[-35.963,-20.09],[-35.725,-20.976],[-35.401,-21.063]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.894117706897,0,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[132.535,174.966],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":48,"op":166,"st":-37.8760708166762,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Krug siniy 2","tt":1,"sr":0.98917079207921,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[412.455,610.955,0],"ix":2},"a":{"a":0,"k":[135.603,464.717,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[0.252,0.252,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":55,"s":[0,0,100]},{"t":111.000102732441,"s":[79.385,79.385,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,105.185],[105.185,0],[0,-105.185],[-105.186,0]],"o":[[0,-105.185],[-105.186,0],[0,105.185],[105.185,0]],"v":[[190.455,0],[0,-190.455],[-190.455,0],[0,190.456]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.603,464.717],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[174.179,174.179],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":48,"op":166,"st":25.2165841584158,"bm":0}],"markers":[]}

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1,59 +0,0 @@
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
void main() => runApp(const App());
class App extends StatelessWidget {
const App({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(body: _Page()),
);
}
}
class _Page extends StatefulWidget {
@override
__PageState createState() => __PageState();
}
class __PageState extends State<_Page> {
var _animationKey = UniqueKey();
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Lottie.network(
'https://assets10.lottiefiles.com/datafiles/QeC7XD39x4C1CIj/data.json',
key: _animationKey,
fit: BoxFit.contain,
width: 200,
height: 200,
),
ElevatedButton(
onPressed: () {
Lottie.cache.clear();
Lottie.cache.maximumSize = 10;
},
child: const Text('Clear cache'),
),
ElevatedButton(
onPressed: () {
setState(() {
_animationKey = UniqueKey();
});
},
child: const Text('Recreate animation'),
),
],
);
}
}

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:lottie/lottie.dart';
void main() => runApp(const MyApp());
@ -31,7 +32,12 @@ class _MyWidgetState extends State<MyWidget> {
void initState() {
super.initState();
_composition = AssetLottie('assets/LottieLogo1.json').load();
_composition = _loadComposition();
}
Future<LottieComposition> _loadComposition() async {
var assetData = await rootBundle.load('assets/LottieLogo1.json');
return await LottieComposition.fromByteData(assetData);
}
@override

View File

@ -43,32 +43,18 @@ final files = [
'assets/Tests/Airbnb.zip',
'assets/Tests/Airbnb400.zip',
'assets/Tests/Airbnb800.zip',
'assets/Tests/AnimatedShadow.json',
'assets/Tests/BeyondBounds.json',
'assets/Tests/BoxPosition.json',
'assets/Tests/CheckSwitch.json',
'assets/Tests/DifferentPointsCount.json',
'assets/Tests/DynamicGradient.json',
'assets/Tests/DynamicText.json',
'assets/Tests/EditedColor.json',
'assets/Tests/EllipseDirection.json',
'assets/Tests/EmbeddedFont.zip',
'assets/Tests/EndFrame.json',
'assets/Tests/Fill.json',
'assets/Tests/FillBlur.json',
'assets/Tests/Font_Text_Justification_Translate_Scale_Rotation_Test.json',
'assets/Tests/Frame.json',
'assets/Tests/Framerate.json',
'assets/Tests/GradientFill.json',
'assets/Tests/GradientFillBlur.json',
'assets/Tests/GradientOneColor.json',
'assets/Tests/GradientOpacityInterpolation.json',
'assets/Tests/GradientStrokeBlur.json',
'assets/Tests/Heart.json',
'assets/Tests/InterpolateBetweenOpacityStops.json',
'assets/Tests/InterpolatorLoopBack.json',
'assets/Tests/KeyframeTypes.json',
'assets/Tests/LargeComposition.json',
'assets/Tests/Laugh4.json',
'assets/Tests/LoopPlayOnce.json',
'assets/Tests/Marker.json',
@ -79,66 +65,39 @@ final files = [
'assets/Tests/MatteTimeStretchLine.json',
'assets/Tests/MatteTimeStretchScan.json',
'assets/Tests/MiterLimit.json',
'assets/Tests/Multiline.json',
'assets/Tests/OpacityStops.json',
'assets/Tests/OverlapShapeWithOpacity.json',
'assets/Tests/Parenting.json',
'assets/Tests/PrecompBlur.json',
'assets/Tests/PrecompBlurDecimapPrecompSize.json',
'assets/Tests/Precomps.json',
'assets/Tests/RGB.json',
'assets/Tests/RGBMarker.json',
'assets/Tests/Rect1.json',
'assets/Tests/Rect3.json',
'assets/Tests/Rect4.json',
'assets/Tests/Rect5.json',
'assets/Tests/Rect6.json',
'assets/Tests/Rect7.json',
'assets/Tests/Rect8.json',
'assets/Tests/Rect9.json',
'assets/Tests/Remap.json',
'assets/Tests/Repeater.json',
'assets/Tests/ReversedStar.json',
'assets/Tests/RoundedCorners.json',
'assets/Tests/RoundedWithAlreadyRoundedCorners.json',
'assets/Tests/Scale0.json',
'assets/Tests/ShapeTypes.json',
'assets/Tests/Shapes.json',
'assets/Tests/Skew.json',
'assets/Tests/SolidLayerTransform.json',
'assets/Tests/SplitDimensions.json',
'assets/Tests/SplitPathTransform.json',
'assets/Tests/Squares.json',
'assets/Tests/StarSkew.json',
'assets/Tests/StartEndFrame.json',
'assets/Tests/StaticShadow.json',
'assets/Tests/Stroke.json',
'assets/Tests/StrokeBlur.json',
'assets/Tests/TelegramAlphaCompat.json',
'assets/Tests/Text.json',
'assets/Tests/TextBaseline.json',
'assets/Tests/TextWithPsCenter.json',
'assets/Tests/TextWithPsLeft.json',
'assets/Tests/Text_Justification_Translate_Scale_Rotation_Text.json',
'assets/Tests/TgsWithoutOpacity.json',
'assets/Tests/Thumb.json',
'assets/Tests/TimeRemapAndStartOffset.json',
'assets/Tests/TimeStretch.json',
'assets/Tests/TimeStretchAndStartOffset.json',
'assets/Tests/TimeStretchMask.json',
'assets/Tests/TimeStretchPrecomp.json',
'assets/Tests/TimeStretchPrecomp2.json',
'assets/Tests/TrackMattes.json',
'assets/Tests/TransformWithoutEndValues.json',
'assets/Tests/TrimPathWrapAround.json',
'assets/Tests/TrimPaths.json',
'assets/Tests/TrimPathsInsideAndOutsideGroup.json',
'assets/Tests/WeAccept.json',
'assets/Tests/WeAcceptInlineImage.json',
'assets/Tests/ZipInlineImage.zip',
'assets/Tests/adrock.json',
'assets/Tests/adrock_converted.json',
'assets/Tests/anim_jpg.zip',
'assets/Tests/august_view_pulse.zip',
'assets/Tests/bm.json',
'assets/Tests/bm_converted.json',
@ -146,11 +105,8 @@ final files = [
'assets/Tests/catrim_converted.json',
'assets/Tests/dalek.json',
'assets/Tests/dalek_converted.json',
'assets/Tests/exported_with_flow.json',
'assets/Tests/hd.json',
'assets/Tests/map.zip',
'assets/Tests/rect2.json',
'assets/Tests/wile.json',
'assets/TwitterHeartButton.json',
'assets/battery_optimizations.json',
'assets/bluetoothscanning.json',
@ -265,7 +221,6 @@ final files = [
'assets/lottiefiles/la_calavera.json',
'assets/lottiefiles/landing_page.json',
'assets/lottiefiles/lego_loader.json',
'assets/lottiefiles/lf20_fteywrno.json',
'assets/lottiefiles/light.json',
'assets/lottiefiles/lightsaber.json',
'assets/lottiefiles/little_girl_jumping_-_loader.json',

View File

@ -5,7 +5,7 @@
import FlutterMacOS
import Foundation
import path_provider_foundation
import path_provider_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))

View File

@ -1,4 +1,4 @@
platform :osx, '10.14'
platform :osx, '10.11'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

View File

@ -1,23 +1,22 @@
PODS:
- FlutterMacOS (1.0.0)
- path_provider_foundation (0.0.1):
- Flutter
- path_provider_macos (0.0.1):
- FlutterMacOS
DEPENDENCIES:
- FlutterMacOS (from `Flutter/ephemeral`)
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/macos`)
- path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`)
EXTERNAL SOURCES:
FlutterMacOS:
:path: Flutter/ephemeral
path_provider_foundation:
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/macos
path_provider_macos:
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos
SPEC CHECKSUMS:
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
path_provider_foundation: 37748e03f12783f9de2cb2c4eadfaa25fe6d4852
FlutterMacOS: ae6af50a8ea7d6103d888583d46bd8328a7e9811
path_provider_macos: 3c0c3b4b0d4a76d2bf989a913c2de869c5641a19
PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7
PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c
COCOAPODS: 1.11.3

View File

@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objectVersion = 51;
objects = {
/* Begin PBXAggregateTarget section */
@ -203,7 +203,7 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0920;
LastUpgradeCheck = 1300;
LastUpgradeCheck = 0930;
ORGANIZATIONNAME = "The Flutter Authors";
TargetAttributes = {
33CC10EC2044A3C60003C045 = {
@ -256,7 +256,6 @@
/* Begin PBXShellScriptBuildPhase section */
3399D490228B24CF009A79C7 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
@ -321,11 +320,11 @@
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
"${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework",
"${BUILT_PRODUCTS_DIR}/path_provider_macos/path_provider_macos.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_macos.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
@ -406,7 +405,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
@ -489,7 +488,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
@ -536,7 +535,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1300"
LastUpgradeVersion = "1000"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"

View File

@ -5,88 +5,70 @@ packages:
dependency: transitive
description:
name: archive
sha256: d6347d54a2d8028e0437e3c099f66fdb8ae02c4720c1e7534c9f24c10351f85d
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "3.3.6"
version: "3.3.2"
async:
dependency: transitive
description:
name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.10.0"
version: "2.9.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
version: "2.1.0"
characters:
dependency: transitive
description:
name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.1"
clock:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.1"
collection:
dependency: transitive
description:
name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.17.0"
convert:
dependency: transitive
description:
name: convert
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
url: "https://pub.dev"
source: hosted
version: "3.1.1"
version: "1.16.0"
crypto:
dependency: transitive
description:
name: crypto
sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.2"
fake_async:
dependency: transitive
description:
name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
file:
dependency: transitive
description:
name: file
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.4"
flutter:
@ -98,16 +80,14 @@ packages:
dependency: "direct main"
description:
name: flutter_colorpicker
sha256: "458a6ed8ea480eb16ff892aedb4b7092b2804affd7e046591fb03127e8d8ef8b"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.3"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
flutter_test:
@ -119,167 +99,140 @@ packages:
dependency: "direct dev"
description:
name: golden_toolkit
sha256: "8f74adab33154fe7b731395782797021f97d2edc52f7bfb85ff4f1b5c4a215f0"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "0.15.0"
version: "0.13.0"
http:
dependency: "direct main"
description:
name: http
sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "0.13.5"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.2"
js:
dependency: transitive
description:
name: js
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
url: "https://pub.dev"
source: hosted
version: "0.6.5"
lints:
dependency: transitive
description:
name: lints
sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
logging:
dependency: "direct main"
description:
name: logging
sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.1"
version: "1.1.0"
lottie:
dependency: "direct main"
description:
path: ".."
relative: true
source: path
version: "2.3.0"
version: "2.0.0"
matcher:
dependency: transitive
description:
name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.13"
version: "0.12.12"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0"
version: "0.1.5"
meta:
dependency: transitive
description:
name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
path:
dependency: "direct main"
description:
name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.2"
path_provider:
dependency: "direct main"
description:
name: path_provider
sha256: "04890b994ee89bfa80bf3080bfec40d5a92c5c7a785ebb02c13084a099d2b6f9"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.13"
version: "2.0.11"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: "7623b7d4be0f0f7d9a8b5ee6879fc13e4522d4c875ab86801dee4af32b54b83e"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.23"
path_provider_foundation:
version: "2.0.21"
path_provider_ios:
dependency: transitive
description:
name: path_provider_foundation
sha256: eec003594f19fe2456ea965ae36b3fc967bc5005f508890aafe31fa75e41d972
url: "https://pub.dev"
name: path_provider_ios
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.2"
version: "2.0.11"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: "525ad5e07622d19447ad740b1ed5070031f7a5437f44355ae915ff56e986429a"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.9"
version: "2.1.7"
path_provider_macos:
dependency: transitive
description:
name: path_provider_macos
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.6"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.6"
version: "2.0.5"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: "642ddf65fde5404f83267e8459ddb4556316d3ee6d511ed193357e25caa3632d"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.4"
version: "2.1.3"
platform:
dependency: transitive
description:
name: platform
sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.4"
pointycastle:
dependency: transitive
description:
name: pointycastle
sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346
url: "https://pub.dev"
source: hosted
version: "3.6.2"
version: "2.1.3"
process:
dependency: transitive
description:
name: process
sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "4.2.4"
sky_engine:
@ -291,82 +244,72 @@ packages:
dependency: transitive
description:
name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.9.1"
version: "1.9.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.11.0"
version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
version: "1.1.1"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.1"
test_api:
dependency: transitive
description:
name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.16"
version: "0.4.12"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
vector_math:
dependency: transitive
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.4"
version: "2.1.2"
win32:
dependency: transitive
description:
name: win32
sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.3"
version: "3.1.1"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
version: "0.2.0+2"
sdks:
dart: ">=2.18.4 <3.0.0"
dart: ">=2.18.0 <3.0.0"
flutter: ">=3.3.0"

View File

@ -10,7 +10,7 @@ export 'src/options.dart' show LottieOptions;
export 'src/providers/asset_provider.dart' show AssetLottie;
export 'src/providers/file_provider.dart' show FileLottie;
export 'src/providers/load_image.dart' show LottieImageProviderFactory;
export 'src/providers/lottie_provider.dart' show LottieProvider, LottieCache;
export 'src/providers/lottie_provider.dart' show LottieProvider;
export 'src/providers/memory_provider.dart' show MemoryLottie;
export 'src/providers/network_provider.dart' show NetworkLottie;
export 'src/raw_lottie.dart' show RawLottie;

View File

@ -52,8 +52,8 @@ class ContentGroup implements DrawingContent, PathContent, KeyPathElement {
List<PathContent>? _pathContents;
TransformKeyframeAnimation? _transformAnimation;
ContentGroup(
LottieDrawable lottieDrawable, BaseLayer layer, ShapeGroup shapeGroup)
ContentGroup(final LottieDrawable lottieDrawable, BaseLayer layer,
ShapeGroup shapeGroup)
: this.copy(
lottieDrawable,
layer,

View File

@ -31,8 +31,8 @@ class GradientStrokeContent extends BaseStrokeContent {
ValueCallbackKeyframeAnimation<List<Color>, List<Color>>?
_colorCallbackAnimation;
GradientStrokeContent(
LottieDrawable lottieDrawable, BaseLayer layer, GradientStroke stroke)
GradientStrokeContent(final LottieDrawable lottieDrawable, BaseLayer layer,
GradientStroke stroke)
: name = stroke.name,
_type = stroke.gradientType,
_hidden = stroke.hidden,

View File

@ -168,12 +168,12 @@ class RoundedCornersContent implements ShapeModifierContent {
var previousCurveData = modifiedCurves[
floorMod(modifiedCurvesIndex - 1, modifiedCurves.length)];
var currentCurveData = modifiedCurves[modifiedCurvesIndex];
previousCurveData.controlPoint2 = Offset(
previousCurve.controlPoint2.dx, previousCurve.controlPoint2.dy);
previousCurveData.controlPoint2 =
Offset(previousCurve.vertex.dx, previousCurve.vertex.dy);
previousCurveData.vertex =
Offset(previousCurve.vertex.dx, previousCurve.vertex.dy);
currentCurveData.controlPoint1 = Offset(
startingCurve.controlPoint1.dx, startingCurve.controlPoint1.dy);
currentCurveData.controlPoint1 =
Offset(startingCurve.vertex.dx, startingCurve.vertex.dy);
modifiedCurvesIndex++;
}
}

View File

@ -17,7 +17,7 @@ class StrokeContent extends BaseStrokeContent {
BaseKeyframeAnimation<ColorFilter, ColorFilter?>? _colorFilterAnimation;
StrokeContent(
LottieDrawable lottieDrawable, BaseLayer layer, ShapeStroke stroke)
final LottieDrawable lottieDrawable, BaseLayer layer, ShapeStroke stroke)
: name = stroke.name,
_hidden = stroke.hidden,
_colorAnimation = stroke.color.createAnimation(),

View File

@ -52,19 +52,16 @@ class _DocumentDataValueCallback extends LottieValueCallback<DocumentData> {
? frameInfo.endValue!
: frameInfo.startValue!;
return DocumentData(
text: text,
fontName: baseDocumentData.fontName,
size: baseDocumentData.size,
justification: baseDocumentData.justification,
tracking: baseDocumentData.tracking,
lineHeight: baseDocumentData.lineHeight,
baselineShift: baseDocumentData.baselineShift,
color: baseDocumentData.color,
strokeColor: baseDocumentData.strokeColor,
strokeWidth: baseDocumentData.strokeWidth,
strokeOverFill: baseDocumentData.strokeOverFill,
boxPosition: baseDocumentData.boxPosition,
boxSize: baseDocumentData.boxSize,
);
text: text,
fontName: baseDocumentData.fontName,
size: baseDocumentData.size,
justification: baseDocumentData.justification,
tracking: baseDocumentData.tracking,
lineHeight: baseDocumentData.lineHeight,
baselineShift: baseDocumentData.baselineShift,
color: baseDocumentData.color,
strokeColor: baseDocumentData.strokeColor,
strokeWidth: baseDocumentData.strokeWidth,
strokeOverFill: baseDocumentData.strokeOverFill);
}
}

View File

@ -4,7 +4,6 @@ import '../lottie.dart';
import 'composition.dart';
import 'l.dart';
import 'lottie_builder.dart';
import 'providers/lottie_provider.dart';
/// A widget to display a loaded [LottieComposition].
/// The [controller] property allows to specify a custom AnimationController that
@ -12,9 +11,6 @@ import 'providers/lottie_provider.dart';
/// automatically and the behavior could be adjusted with the properties [animate],
/// [repeat] and [reverse].
class Lottie extends StatefulWidget {
/// The cache instance for recently loaded Lottie compositions.
static LottieCache get cache => sharedLottieCache;
const Lottie({
super.key,
required this.composition,

View File

@ -441,22 +441,17 @@ class _LottieBuilderState extends State<LottieBuilder> {
void _load() {
var provider = widget.lottie;
_loadingFuture = widget.lottie.load().then((composition) {
// LottieProvier.load() can return a Synchronous future and the onLoaded
// callback can call setState, so we wrap it in a microtask to avoid an
// "!_isDirty" error.
scheduleMicrotask(() {
if (mounted && widget.lottie == provider) {
var onWarning = widget.onWarning;
composition.onWarning = onWarning;
if (onWarning != null) {
for (var warning in composition.warnings) {
onWarning(warning);
}
if (mounted && widget.lottie == provider) {
var onWarning = widget.onWarning;
composition.onWarning = onWarning;
if (onWarning != null) {
for (var warning in composition.warnings) {
onWarning(warning);
}
widget.onLoaded?.call(composition);
}
});
widget.onLoaded?.call(composition);
}
return composition;
});
@ -477,14 +472,12 @@ class _LottieBuilderState extends State<LottieBuilder> {
}
var composition = snapshot.data;
var animate = widget.animate;
animate ??= (composition?.durationFrames ?? 0) > 1.0;
Widget result = Lottie(
composition: composition,
controller: widget.controller,
frameRate: widget.frameRate,
animate: animate,
animate: widget.animate,
reverse: widget.reverse,
repeat: widget.repeat,
delegates: widget.delegates,

View File

@ -5,22 +5,9 @@ import 'lottie_drawable.dart';
import 'lottie_image_asset.dart';
import 'value_delegate.dart';
TextStyle defaultTextStyleDelegate(LottieFontStyle font) {
var style = font.style.toLowerCase();
var fontStyle = style.contains('italic') ? FontStyle.italic : null;
FontWeight? fontWeight;
if (style.contains('semibold') || style.contains('semi bold')) {
fontWeight = FontWeight.w600;
} else if (style.contains('bold')) {
fontWeight = FontWeight.bold;
}
return TextStyle(
fontFamily: font.fontFamily,
fontStyle: fontStyle,
fontWeight: fontWeight);
}
// TODO(xha): recognize style Bold, Medium, Regular, SemiBold, etc...
TextStyle defaultTextStyleDelegate(LottieFontStyle font) =>
TextStyle(fontFamily: font.fontFamily);
@immutable
class LottieDelegates {

View File

@ -1,57 +1,11 @@
import '../../animation/keyframe/gradient_color_keyframe_animation.dart';
import '../../value/keyframe.dart';
import '../content/gradient_color.dart';
import 'base_animatable_value.dart';
class AnimatableGradientColorValue
extends BaseAnimatableValue<GradientColor, GradientColor> {
AnimatableGradientColorValue.fromKeyframes(
List<Keyframe<GradientColor>> keyframes)
: super.fromKeyframes(_ensureInterpolatableKeyframes(keyframes));
static List<Keyframe<GradientColor>> _ensureInterpolatableKeyframes(
List<Keyframe<GradientColor>> keyframes) {
for (var i = 0; i < keyframes.length; i++) {
keyframes[i] = _ensureInterpolatableKeyframe(keyframes[i]);
}
return keyframes;
}
static Keyframe<GradientColor> _ensureInterpolatableKeyframe(
Keyframe<GradientColor> keyframe) {
var startValue = keyframe.startValue;
var endValue = keyframe.endValue;
if (startValue == null ||
endValue == null ||
startValue.positions.length == endValue.positions.length) {
return keyframe;
}
var mergedPositions =
_mergePositions(startValue.positions, endValue.positions);
// The start/end has opacity stops which required adding extra positions in between the existing colors.
return keyframe.copyWith(startValue.copyWithPositions(mergedPositions),
endValue.copyWithPositions(mergedPositions));
}
static List<double> _mergePositions(
List<double> startPositions, List<double> endPositions) {
var mergedArray =
List<double>.filled(startPositions.length + endPositions.length, 0);
mergedArray.setRange(0, startPositions.length, startPositions);
mergedArray.setRange(startPositions.length,
startPositions.length + endPositions.length, endPositions);
mergedArray.sort();
var uniqueValues = 0;
var lastValue = double.nan;
for (var i = 0; i < mergedArray.length; i++) {
if (mergedArray[i] != lastValue) {
mergedArray[uniqueValues] = mergedArray[i];
uniqueValues++;
lastValue = mergedArray[i];
}
}
return mergedArray.take(uniqueValues).toList();
}
AnimatableGradientColorValue.fromKeyframes(super.keyframes)
: super.fromKeyframes();
@override
GradientColorKeyframeAnimation createAnimation() {

View File

@ -1,5 +1,4 @@
import 'dart:ui';
import '../../utils/collection.dart';
import '../../utils/gamma_evaluator.dart';
class GradientColor {
@ -22,33 +21,4 @@ class GradientColor {
GammaEvaluator.evaluate(progress, gc1.colors[i], gc2.colors[i]);
}
}
GradientColor copyWithPositions(List<double> positions) {
var colors = List<Color>.filled(positions.length, const Color(0x00000000));
for (var i = 0; i < positions.length; i++) {
colors[i] = _getColorForPosition(positions[i]);
}
return GradientColor(positions, colors);
}
Color _getColorForPosition(double position) {
var existingIndex = binarySearch(positions, position);
if (existingIndex >= 0) {
return colors[existingIndex];
}
// binarySearch returns -insertionPoint - 1 if it is not found.
var insertionPoint = -(existingIndex + 1);
if (insertionPoint == 0) {
return colors[0];
} else if (insertionPoint == colors.length - 1) {
return colors[colors.length - 1];
}
var startPosition = positions[insertionPoint - 1];
var endPosition = positions[insertionPoint];
var startColor = colors[insertionPoint - 1];
var endColor = colors[insertionPoint];
var fraction = (position - startPosition) / (endPosition - startPosition);
return GammaEvaluator.evaluate(fraction, startColor, endColor);
}
}

View File

@ -8,16 +8,12 @@ class DocumentData {
final double size;
final Justification justification;
final int tracking;
/// Extra space in between lines. */
final double lineHeight;
final double baselineShift;
final Color color;
final Color strokeColor;
final double strokeWidth;
final bool strokeOverFill;
final Offset? boxPosition;
final Offset? boxSize;
DocumentData({
required this.text,
@ -31,27 +27,22 @@ class DocumentData {
required this.strokeColor,
required this.strokeWidth,
required this.strokeOverFill,
required this.boxPosition,
required this.boxSize,
});
@override
int get hashCode {
return Object.hash(
text,
fontName,
size,
justification.index,
tracking,
lineHeight,
baselineShift,
color,
strokeColor,
strokeWidth,
strokeOverFill,
boxPosition,
boxSize,
);
text,
fontName,
size,
justification.index,
tracking,
lineHeight,
baselineShift,
color,
strokeColor,
strokeWidth,
strokeOverFill);
}
@override
@ -69,7 +60,5 @@ class DocumentData {
color == other.color &&
strokeColor == other.strokeColor &&
strokeWidth == other.strokeWidth &&
strokeOverFill == other.strokeOverFill &&
boxPosition == other.boxPosition &&
boxSize == other.boxSize;
strokeOverFill == other.strokeOverFill;
}

View File

@ -2,7 +2,8 @@ import 'content/shape_group.dart';
class FontCharacter {
static int hashFor(String character, String fontFamily, String style) {
var result = character.hashCode;
var result = 0;
result = 31 * result + character.hashCode;
result = 31 * result + fontFamily.hashCode;
result = 31 * result + style.hashCode;
return result;

View File

@ -7,7 +7,6 @@ import '../../composition.dart';
import '../../lottie_drawable.dart';
import '../../lottie_property.dart';
import '../../utils.dart';
import '../../utils/characters.dart';
import '../../value/lottie_value_callback.dart';
import '../document_data.dart';
import '../font.dart';
@ -22,9 +21,6 @@ class TextLayer extends BaseLayer {
final _fillPaint = Paint()..style = PaintingStyle.fill;
final _strokePaint = Paint()..style = PaintingStyle.stroke;
final _contentsForCharacter = <FontCharacter, List<ContentGroup>>{};
/// If this is paragraph text, one line may wrap depending on the size of the document data box.
final _textSubLines = <_TextSubLine>[];
final TextKeyframeAnimation _textAnimation;
final LottieComposition _composition;
@ -92,26 +88,18 @@ class TextLayer extends BaseLayer {
@override
void drawLayer(Canvas canvas, Size size, Matrix4 parentMatrix,
{required int parentAlpha}) {
canvas.save();
if (!lottieDrawable.useTextGlyphs) {
canvas.transform(parentMatrix.storage);
}
var documentData = _textAnimation.value;
var font = _composition.fonts[documentData.fontName];
if (font == null) {
// Something is wrong.
canvas.restore();
return;
}
canvas.save();
canvas.transform(parentMatrix.storage);
_configurePaint(documentData, parentMatrix);
if (lottieDrawable.useTextGlyphs) {
_drawTextWithGlyphs(documentData, parentMatrix, font, canvas);
} else {
_drawTextWithFont(documentData, font, canvas);
}
canvas.restore();
}
void _configurePaint(DocumentData documentData, Matrix4 parentMatrix) {
Color fillPaintColor;
if (_colorCallbackAnimation != null) {
fillPaintColor = _colorCallbackAnimation!.value;
@ -142,11 +130,20 @@ class TextLayer extends BaseLayer {
} else if (_strokeWidthAnimation != null) {
_strokePaint.strokeWidth = _strokeWidthAnimation!.value;
} else {
_strokePaint.strokeWidth = documentData.strokeWidth;
var parentScale = parentMatrix.getScale();
_strokePaint.strokeWidth = documentData.strokeWidth * parentScale;
}
if (lottieDrawable.useTextGlyphs) {
_drawTextGlyphs(documentData, parentMatrix, font, canvas);
} else {
_drawTextWithFont(documentData, font, parentMatrix, canvas);
}
canvas.restore();
}
void _drawTextWithGlyphs(DocumentData documentData, Matrix4 parentMatrix,
void _drawTextGlyphs(DocumentData documentData, Matrix4 parentMatrix,
Font font, Canvas canvas) {
double textSize;
if (_textSizeCallbackAnimation != null) {
@ -160,55 +157,73 @@ class TextLayer extends BaseLayer {
var parentScale = parentMatrix.getScale();
var text = documentData.text;
canvas.transform(parentMatrix.storage);
// Line height
var lineHeight = documentData.lineHeight;
// Split full text in multiple lines
var textLines = _getTextLines(text);
var textLineCount = textLines.length;
// Add tracking
var tracking = documentData.tracking / 10;
if (_trackingCallbackAnimation != null) {
tracking += _trackingCallbackAnimation!.value;
} else if (_trackingAnimation != null) {
tracking += _trackingAnimation!.value;
for (var l = 0; l < textLineCount; l++) {
var textLine = textLines[l];
var textLineWidth =
_getTextLineWidthForGlyphs(textLine, font, fontScale, parentScale);
canvas.save();
// Apply horizontal justification
_applyJustification(documentData.justification, canvas, textLineWidth);
// Center text vertically
var multilineTranslateY = (textLineCount - 1) * lineHeight / 2;
var translateY = l * lineHeight - multilineTranslateY;
canvas.translate(0, translateY);
// Draw each line
_drawGlyphTextLine(textLine, documentData, Matrix4.identity(), font, canvas,
parentScale, fontScale);
// Reset canvas
canvas.restore();
}
var lineIndex = -1;
for (var i = 0; i < textLineCount; i++) {
var textLine = textLines[i];
var boxWidth = documentData.boxSize?.dx ?? 0.0;
var lines = _splitGlyphTextIntoLines(
textLine, boxWidth, font, fontScale, tracking, null);
for (var j = 0; j < lines.length; j++) {
var line = lines[j];
lineIndex++;
canvas.save();
_offsetCanvas(canvas, documentData, lineIndex, line.width);
_drawGlyphTextLine(line.text, documentData, font, canvas, parentScale,
fontScale, tracking);
canvas.restore();
}
}
canvas.restore();
}
void _drawGlyphTextLine(Characters text, DocumentData documentData, Font font,
Canvas canvas, double parentScale, double fontScale, double tracking) {
for (var c in text) {
var characterHash =
FontCharacter.hashFor(c.toString(), font.family, font.style);
void _drawGlyphTextLine(
String text,
DocumentData documentData,
Matrix4 parentMatrix,
Font font,
Canvas canvas,
double parentScale,
double fontScale) {
for (var i = 0; i < text.length; i++) {
var c = text[i];
var characterHash = FontCharacter.hashFor(c, font.family, font.style);
var character = _composition.characters[characterHash];
if (character == null) {
// Something is wrong. Potentially, they didn't export the text as a glyph.
continue;
}
_drawCharacterAsGlyph(character, fontScale, documentData, canvas);
var tx = character.width * fontScale + tracking;
_drawCharacterAsGlyph(
character, parentMatrix, fontScale, documentData, canvas);
var tx = character.width * fontScale * parentScale;
// Add tracking
var tracking = documentData.tracking / 10.0;
if (_trackingCallbackAnimation != null) {
tracking += _trackingCallbackAnimation!.value;
} else if (_trackingAnimation != null) {
tracking += _trackingAnimation!.value;
}
tx += tracking * parentScale;
canvas.translate(tx, 0);
}
}
void _drawTextWithFont(DocumentData documentData, Font font, Canvas canvas) {
void _drawTextWithFont(DocumentData documentData, Font font,
Matrix4 parentMatrix, Canvas canvas) {
var textStyle = lottieDrawable.getTextStyle(font.family, font.style);
var text = documentData.text;
var textDelegate = lottieDrawable.delegates?.text;
@ -225,6 +240,9 @@ class TextLayer extends BaseLayer {
}
textStyle = textStyle.copyWith(fontSize: textSize);
// Line height
var lineHeight = documentData.lineHeight;
// Calculate tracking
var tracking = documentData.tracking / 10;
if (_trackingCallbackAnimation != null) {
@ -237,62 +255,44 @@ class TextLayer extends BaseLayer {
// Split full text in multiple lines
var textLines = _getTextLines(text);
var textLineCount = textLines.length;
var lineIndex = -1;
for (var i = 0; i < textLineCount; i++) {
var textLine = textLines[i];
var boxWidth = documentData.boxSize?.dx ?? 0.0;
var lines = _splitGlyphTextIntoLines(
textLine, boxWidth, font, 0.0, tracking, textStyle);
for (var j = 0; j < lines.length; j++) {
var line = lines[j];
lineIndex++;
for (var l = 0; l < textLineCount; l++) {
var textLine = textLines[l];
var textPainter = TextPainter(
text: TextSpan(text: textLine, style: textStyle),
textDirection: _textDirection);
textPainter.layout();
var textLineWidth = textPainter.width;
// We have to manually add the tracking between characters as the strokePaint ignores it
textLineWidth += (textLine.length - 1) * tracking;
canvas.save();
canvas.save();
_offsetCanvas(canvas, documentData, lineIndex, line.width);
_drawFontTextLine(line.text, textStyle, documentData, canvas, tracking);
// Apply horizontal justification
_applyJustification(documentData.justification, canvas, textLineWidth);
canvas.restore();
}
// Center text vertically
var multilineTranslateY = (textLineCount - 1) * lineHeight / 2;
var translateY = l * lineHeight - multilineTranslateY;
canvas.translate(0, translateY);
// Draw each line
_drawFontTextLine(textLine, textStyle, documentData, canvas, tracking);
// Reset canvas
canvas.restore();
}
}
void _offsetCanvas(Canvas canvas, DocumentData documentData, int lineIndex,
double lineWidth) {
var position = documentData.boxPosition;
var size = documentData.boxSize;
var lineStartY =
position == null ? 0 : documentData.lineHeight + position.dy;
var lineOffset = lineIndex * documentData.lineHeight + lineStartY;
var lineStart = position?.dx ?? 0.0;
var boxWidth = size?.dx ?? 0.0;
switch (documentData.justification) {
case Justification.leftAlign:
canvas.translate(lineStart, lineOffset);
break;
case Justification.rightAlign:
canvas.translate(lineStart + boxWidth - lineWidth, lineOffset);
break;
case Justification.center:
canvas.translate(
lineStart + boxWidth / 2.0 - lineWidth / 2.0, lineOffset);
break;
}
}
List<Characters> _getTextLines(String text) {
List<String> _getTextLines(String text) {
// Split full text by carriage return character
var formattedText = text
.replaceAll('\r\n', '\r')
.replaceAll('\u0003', '\r')
.replaceAll('\n', '\r');
var formattedText = text.replaceAll('\r\n', '\r').replaceAll('\n', '\r');
var textLinesArray = formattedText.split('\r');
return textLinesArray.map((l) => l.characters).toList();
return textLinesArray;
}
void _drawFontTextLine(Characters text, TextStyle textStyle,
void _drawFontTextLine(String text, TextStyle textStyle,
DocumentData documentData, Canvas canvas, double tracking) {
for (var char in text) {
for (var char in text.characters) {
var charString = char;
_drawCharacterFromFont(charString, textStyle, documentData, canvas);
var textPainter = TextPainter(
@ -305,109 +305,43 @@ class TextLayer extends BaseLayer {
}
}
List<_TextSubLine> _splitGlyphTextIntoLines(
Characters textLine,
double boxWidth,
Font font,
double fontScale,
double tracking,
TextStyle? textStyle) {
var usingGlyphs = textStyle == null;
var lineCount = 0;
var currentLineWidth = 0.0;
var currentLineStartIndex = 0;
var currentWordStartIndex = 0;
var currentWordWidth = 0.0;
var nextCharacterStartsWord = false;
// The measured size of a space.
var spaceWidth = 0.0;
var textPainter = TextPainter(
text: TextSpan(text: '', style: textStyle),
textDirection: _textDirection);
var i = 0;
for (var c in textLine) {
double currentCharWidth;
if (usingGlyphs) {
var characterHash = FontCharacter.hashFor(c, font.family, font.style);
var character = _composition.characters[characterHash];
if (character == null) {
continue;
}
currentCharWidth = character.width * fontScale + tracking;
} else {
textPainter.text = TextSpan(text: c, style: textStyle);
textPainter.layout();
currentCharWidth = textPainter.width + tracking;
double _getTextLineWidthForGlyphs(
String textLine, Font font, double fontScale, double parentScale) {
var textLineWidth = 0.0;
for (var i = 0; i < textLine.length; i++) {
var c = textLine[i];
var characterHash = FontCharacter.hashFor(c, font.family, font.style);
var character = _composition.characters[characterHash];
if (character == null) {
continue;
}
if (c == ' ') {
spaceWidth = currentCharWidth;
nextCharacterStartsWord = true;
} else if (nextCharacterStartsWord) {
nextCharacterStartsWord = false;
currentWordStartIndex = i;
currentWordWidth = currentCharWidth;
} else {
currentWordWidth += currentCharWidth;
}
currentLineWidth += currentCharWidth;
if (boxWidth > 0 && currentLineWidth >= boxWidth) {
if (c == ' ') {
// Spaces at the end of a line don't do anything. Ignore it.
// The next non-space character will hit the conditions below.
continue;
}
var subLine = _ensureEnoughSubLines(++lineCount);
if (currentWordStartIndex == currentLineStartIndex) {
// Only word on line is wider than box, start wrapping mid-word.
var substr = textLine.getRange(currentLineStartIndex, i);
var trimmed = substr.trim(' '.characters);
var trimmedSpace = (trimmed.length - substr.length) * spaceWidth;
subLine.set(
trimmed, currentLineWidth - currentCharWidth - trimmedSpace);
currentLineStartIndex = i;
currentLineWidth = currentCharWidth;
currentWordStartIndex = currentLineStartIndex;
currentWordWidth = currentCharWidth;
} else {
var substr = textLine.getRange(
currentLineStartIndex, currentWordStartIndex - 1);
var trimmed = substr.trim(' '.characters);
var trimmedSpace = (substr.length - trimmed.length) * spaceWidth;
subLine.set(trimmed,
currentLineWidth - currentWordWidth - trimmedSpace - spaceWidth);
currentLineStartIndex = currentWordStartIndex;
currentLineWidth = currentWordWidth;
}
}
++i;
textLineWidth += character.width * fontScale * parentScale;
}
if (currentLineWidth > 0) {
var line = _ensureEnoughSubLines(++lineCount);
line.set(textLine.getRange(currentLineStartIndex), currentLineWidth);
}
return _textSubLines.sublist(0, lineCount);
return textLineWidth;
}
/// Elements are reused and not deleted to save allocations.
_TextSubLine _ensureEnoughSubLines(int numLines) {
for (var i = _textSubLines.length; i < numLines; i++) {
_textSubLines.add(_TextSubLine());
void _applyJustification(
Justification justification, Canvas canvas, double textLineWidth) {
switch (justification) {
case Justification.leftAlign:
// Do nothing. Default is left aligned.
break;
case Justification.rightAlign:
canvas.translate(-textLineWidth, 0);
break;
case Justification.center:
canvas.translate(-textLineWidth / 2, 0);
break;
}
return _textSubLines[numLines - 1];
}
void _drawCharacterAsGlyph(FontCharacter character, double fontScale,
DocumentData documentData, Canvas canvas) {
void _drawCharacterAsGlyph(FontCharacter character, Matrix4 parentMatrix,
double fontScale, DocumentData documentData, Canvas canvas) {
var contentGroups = _getContentsForCharacter(character);
for (var j = 0; j < contentGroups.length; j++) {
var path = contentGroups[j].getPath();
_matrix.reset();
path.getBounds();
_matrix.set(parentMatrix);
_matrix.translate(0.0, -documentData.baselineShift);
_matrix.scale(fontScale, fontScale);
path = path.transform(_matrix.storage);
@ -555,13 +489,3 @@ class TextLayer extends BaseLayer {
}
}
}
class _TextSubLine {
Characters text = Characters.empty;
double width = 0.0;
void set(Characters text, double width) {
this.text = text;
this.width = width;
}
}

View File

@ -73,7 +73,9 @@ class AnimatableValueParser {
}
static List<Keyframe<T>> parse<T>(JsonReader reader,
LottieComposition composition, ValueParser<T> valueParser) {
LottieComposition composition, ValueParser<T> valueParser,
{double? scale}) {
scale ??= 1.0;
return KeyframesParser.parse(reader, composition, valueParser);
}
}

View File

@ -15,8 +15,6 @@ final JsonReaderOptions _names = JsonReaderOptions.of([
'sc', // 8
'sw', // 9
'of', // 10
'ps', // 11
'sz', // 12
]);
DocumentData documentDataParser(JsonReader reader) {
@ -31,8 +29,6 @@ DocumentData documentDataParser(JsonReader reader) {
var strokeColor = const Color(0x00000000);
var strokeWidth = 0.0;
var strokeOverFill = true;
Offset? boxPosition;
Offset? boxSize;
reader.beginObject();
while (reader.hasNext()) {
@ -76,16 +72,6 @@ DocumentData documentDataParser(JsonReader reader) {
case 10:
strokeOverFill = reader.nextBoolean();
break;
case 11:
reader.beginArray();
boxPosition = Offset(reader.nextDouble(), reader.nextDouble());
reader.endArray();
break;
case 12:
reader.beginArray();
boxSize = Offset(reader.nextDouble(), reader.nextDouble());
reader.endArray();
break;
default:
reader.skipName();
reader.skipValue();
@ -94,18 +80,15 @@ DocumentData documentDataParser(JsonReader reader) {
reader.endObject();
return DocumentData(
text: text ?? '',
fontName: fontName,
size: size,
justification: justification,
tracking: tracking,
lineHeight: lineHeight,
baselineShift: baselineShift,
color: fillColor,
strokeColor: strokeColor,
strokeWidth: strokeWidth,
strokeOverFill: strokeOverFill,
boxPosition: boxPosition,
boxSize: boxSize,
);
text: text ?? '',
fontName: fontName,
size: size,
justification: justification,
tracking: tracking,
lineHeight: lineHeight,
baselineShift: baselineShift,
color: fillColor,
strokeColor: strokeColor,
strokeWidth: strokeWidth,
strokeOverFill: strokeOverFill);
}

View File

@ -1,7 +1,5 @@
import 'dart:ui';
import '../model/content/gradient_color.dart';
import '../utils/collection.dart';
import '../utils/gamma_evaluator.dart';
import 'moshi/json_reader.dart';
class GradientColorParser {
@ -84,7 +82,7 @@ class GradientColorParser {
}
var gradientColor = GradientColor(positions, colors);
gradientColor = _addOpacityStopsToGradientIfNeeded(gradientColor, array);
_addOpacityStopsToGradientIfNeeded(gradientColor, array);
return gradientColor;
}
@ -95,159 +93,50 @@ class GradientColorParser {
/// <p>
/// This should be a good approximation is nearly all cases. However, if there are many more
/// opacity stops than color stops, information will be lost.
GradientColor _addOpacityStopsToGradientIfNeeded(
void _addOpacityStopsToGradientIfNeeded(
GradientColor gradientColor, List<double> array) {
var startIndex = _colorPoints * 4;
if (array.length <= startIndex) {
return gradientColor;
return;
}
// When there are opacity stops, we create a merged list of color stops and opacity stops.
// For a given color stop, we linearly interpolate the opacity for the two opacity stops around it.
// For a given opacity stop, we linearly interpolate the color for the two color stops around it.
var colorStopPositions = gradientColor.positions;
var colorStopColors = gradientColor.colors;
var opacityStops = (array.length - startIndex) ~/ 2;
var opacityStopPositions = List<double>.filled(opacityStops, 0.0);
var opacityStopOpacities = List<double>.filled(opacityStops, 0.0);
var positions = List<double>.filled(opacityStops, 0.0);
var opacities = List<double>.filled(opacityStops, 0.0);
for (var i = startIndex, j = 0; i < array.length; i++) {
if (i % 2 == 0) {
opacityStopPositions[j] = array[i];
positions[j] = array[i];
} else {
opacityStopOpacities[j] = array[i];
opacities[j] = array[i];
j++;
}
}
// Pre-SKIA (Oreo) devices render artifacts when there is two stops in the same position.
// As a result, we have to de-dupe the merge color and opacity stop positions.
var newPositions =
mergeUniqueElements(gradientColor.positions, opacityStopPositions);
var newColorPoints = newPositions.length;
var newColors = List<Color>.filled(newColorPoints, const Color(0xff000000));
for (var i = 0; i < gradientColor.size; i++) {
var color = gradientColor.colors[i];
color = color.withAlpha(_getOpacityAtPosition(
gradientColor.positions[i], positions, opacities));
gradientColor.colors[i] = color;
}
}
for (var i = 0; i < newColorPoints; i++) {
var position = newPositions[i];
var colorStopIndex = binarySearch(colorStopPositions, position);
var opacityIndex = binarySearch(opacityStopPositions, position);
if (colorStopIndex < 0 || opacityIndex > 0) {
// This is a stop derived from an opacity stop.
if (opacityIndex < 0) {
// The formula here is derived from the return value for binarySearch. When an item isn't found, it returns -insertionPoint - 1.
opacityIndex = -(opacityIndex + 1);
int _getOpacityAtPosition(
double position, List<double> positions, List<double> opacities) {
for (var i = 1; i < positions.length; i++) {
var lastPosition = positions[i - 1];
var thisPosition = positions[i];
if (positions[i] >= position) {
var progress =
(position - lastPosition) / (thisPosition - lastPosition);
progress = progress.clamp(0, 1);
if (progress.isNaN) {
progress = 0.0;
}
newColors[i] = _getColorInBetweenColorStops(
position,
opacityStopOpacities[opacityIndex],
colorStopPositions,
colorStopColors);
} else {
// This os a step derived from a color stop.
newColors[i] = _getColorInBetweenOpacityStops(
position,
colorStopColors[colorStopIndex],
opacityStopPositions,
opacityStopOpacities);
return (255 * lerpDouble(opacities[i - 1], opacities[i], progress)!)
.round();
}
}
return GradientColor(newPositions, newColors);
}
Color _getColorInBetweenColorStops(double position, double opacity,
List<double> colorStopPositions, List<Color> colorStopColors) {
if (colorStopColors.length < 2 || position == colorStopPositions[0]) {
return colorStopColors[0];
}
for (var i = 1; i < colorStopPositions.length; i++) {
var colorStopPosition = colorStopPositions[i];
if (colorStopPosition < position && i != colorStopPositions.length - 1) {
continue;
}
// We found the position in which position is between i - 1 and i.
var distanceBetweenColors =
colorStopPositions[i] - colorStopPositions[i - 1];
var distanceToLowerColor = position - colorStopPositions[i - 1];
var percentage = distanceToLowerColor / distanceBetweenColors;
var upperColor = colorStopColors[i];
var lowerColor = colorStopColors[i - 1];
return GammaEvaluator.evaluate(
percentage, upperColor.withOpacity(1), lowerColor.withOpacity(1))
.withOpacity(opacity);
}
throw Exception('Unreachable code.');
}
Color _getColorInBetweenOpacityStops(double position, Color color,
List<double> opacityStopPositions, List<double> opacityStopOpacities) {
if (opacityStopOpacities.length < 2 ||
position <= opacityStopPositions[0]) {
return color.withOpacity(opacityStopOpacities[0]);
}
for (var i = 1; i < opacityStopPositions.length; i++) {
var opacityStopPosition = opacityStopPositions[i];
if (opacityStopPosition < position &&
i != opacityStopPositions.length - 1) {
continue;
}
final double opacity;
if (opacityStopPosition <= position) {
opacity = opacityStopOpacities[i];
} else {
// We found the position in which position in between i - 1 and i.
var distanceBetweenOpacities =
opacityStopPositions[i] - opacityStopPositions[i - 1];
var distanceToLowerOpacity = position - opacityStopPositions[i - 1];
var percentage = distanceToLowerOpacity / distanceBetweenOpacities;
opacity = lerpDouble(
opacityStopOpacities[i - 1], opacityStopOpacities[i], percentage)!;
}
return color.withOpacity(opacity);
}
throw Exception('Unreachable code.');
}
/// Takes two sorted float arrays and merges their elements while removing duplicates.
static List<double> mergeUniqueElements(
List<double> arrayA, List<double> arrayB) {
if (arrayA.isEmpty) {
return arrayB;
} else if (arrayB.isEmpty) {
return arrayA;
}
var aIndex = 0;
var bIndex = 0;
var numDuplicates = 0;
// This will be the merged list but may be longer than what is needed if there are duplicates.
// If there are, the 0 elements at the end need to be truncated.
var mergedNotTruncated =
List<double>.filled(arrayA.length + arrayB.length, 0);
for (var i = 0; i < mergedNotTruncated.length; i++) {
final a = aIndex < arrayA.length ? arrayA[aIndex] : double.nan;
final b = bIndex < arrayB.length ? arrayB[bIndex] : double.nan;
if (b.isNaN || a < b) {
mergedNotTruncated[i] = a;
aIndex++;
} else if (a.isNaN || b < a) {
mergedNotTruncated[i] = b;
bIndex++;
} else {
mergedNotTruncated[i] = a;
aIndex++;
bIndex++;
numDuplicates++;
}
}
if (numDuplicates == 0) {
return mergedNotTruncated;
}
return mergedNotTruncated
.take(mergedNotTruncated.length - numDuplicates)
.toList();
return (255 * opacities[opacities.length - 1]).round();
}
}

View File

@ -25,8 +25,9 @@ class AssetLottie extends LottieProvider {
final String? package;
@override
Future<LottieComposition> load() {
return sharedLottieCache.putIfAbsent(this, () async {
Future<LottieComposition> load() async {
var cacheKey = 'asset-$keyName-$bundle';
return sharedLottieCache.putIfAbsent(cacheKey, () async {
final chosenBundle = bundle ?? rootBundle;
var data = await chosenBundle.load(keyName);

View File

@ -12,8 +12,9 @@ class FileLottie extends LottieProvider {
final Object /*io.File|html.File*/ file;
@override
Future<LottieComposition> load() {
return sharedLottieCache.putIfAbsent(this, () async {
Future<LottieComposition> load() async {
var cacheKey = 'file-${io.filePath(file)}';
return sharedLottieCache.putIfAbsent(cacheKey, () async {
var bytes = await io.loadFile(file);
var composition = await LottieComposition.fromBytes(bytes,
name: p.basenameWithoutExtension(io.filePath(file)),

View File

@ -1,5 +1,4 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import '../../lottie.dart';
import 'load_image.dart';
@ -20,103 +19,37 @@ abstract class LottieProvider {
}
class LottieCache {
final Map<Object, Future<LottieComposition>> _pending =
<Object, Future<LottieComposition>>{};
final Map<Object, LottieComposition> _cache = <Object, LottieComposition>{};
final int maximumSize;
final _cache = <String, Future<LottieComposition>>{};
/// Maximum number of entries to store in the cache.
///
/// Once this many entries have been cached, the least-recently-used entry is
/// evicted when adding a new entry.
int get maximumSize => _maximumSize;
int _maximumSize = 1000;
LottieCache({int? maximumSize}) : maximumSize = maximumSize ?? 1000;
/// Changes the maximum cache size.
///
/// If the new size is smaller than the current number of elements, the
/// extraneous elements are evicted immediately. Setting this to zero and then
/// returning it to its original value will therefore immediately clear the
/// cache.
set maximumSize(int value) {
assert(value >= 0);
if (value == maximumSize) {
return;
}
_maximumSize = value;
if (maximumSize == 0) {
clear();
Future<LottieComposition> putIfAbsent(
String key, Future<LottieComposition> Function() load) {
var composition = _cache[key];
if (composition != null) {
// Remove it so that we add it in front of the cache to prevent evicted
_cache.remove(key);
} else {
while (_cache.length > maximumSize) {
_cache.remove(_cache.keys.first);
}
composition = load();
}
_cache[key] = composition;
_checkCacheSize();
return composition;
}
void _checkCacheSize() {
while (_cache.length > maximumSize) {
_cache.remove(_cache.keys.first);
}
}
/// Evicts all entries from the cache.
///
/// This is useful if, for instance, the root asset bundle has been updated
/// and therefore new images must be obtained.
void clear() {
_cache.clear();
}
/// Evicts a single entry from the cache, returning true if successful.
bool evict(Object key) {
return _cache.remove(key) != null;
}
/// Returns the previously cached [LottieComposition] for the given key, if available;
/// if not, calls the given callback to obtain it first. In either case, the
/// key is moved to the "most recently used" position.
///
/// The arguments must not be null. The `loader` cannot return null.
Future<LottieComposition> putIfAbsent(
Object key,
Future<LottieComposition> Function() loader,
) {
var pendingResult = _pending[key];
if (pendingResult != null) {
return pendingResult;
}
var result = _cache[key];
if (result != null) {
// Remove the provider from the list so that we can put it back in below
// and thus move it to the end of the list.
_cache.remove(key);
} else {
if (_cache.length == maximumSize && maximumSize > 0) {
_cache.remove(_cache.keys.first);
}
pendingResult = loader();
_pending[key] = pendingResult;
pendingResult.then<void>((LottieComposition data) {
_pending.remove(key);
_add(key, data);
result = data; // in case it was a synchronous future.
}).catchError((Object? e) {
_pending.remove(key);
});
}
if (result != null) {
_add(key, result!);
return SynchronousFuture<LottieComposition>(result!);
}
assert(_cache.length <= maximumSize);
return pendingResult!;
}
void _add(Object key, LottieComposition result) {
if (maximumSize > 0) {
assert(_cache.length < maximumSize);
_cache[key] = result;
}
assert(_cache.length <= maximumSize);
}
/// The number of entries in the cache.
int get count => _cache.length;
}
final sharedLottieCache = LottieCache();

View File

@ -13,8 +13,10 @@ class MemoryLottie extends LottieProvider {
final Uint8List bytes;
@override
Future<LottieComposition> load() {
return sharedLottieCache.putIfAbsent(this, () async {
Future<LottieComposition> load() async {
// TODO(xha): hash the list content
var cacheKey = 'memory-${bytes.hashCode}-${bytes.lengthInBytes}';
return sharedLottieCache.putIfAbsent(cacheKey, () async {
var composition = await LottieComposition.fromBytes(bytes,
imageProviderFactory: imageProviderFactory);
for (var image in composition.images.values) {
@ -38,8 +40,6 @@ class MemoryLottie extends LottieProvider {
@override
bool operator ==(dynamic other) {
if (other.runtimeType != runtimeType) return false;
//TODO(xha): compare bytes content
return other is MemoryLottie && other.bytes == bytes;
}

View File

@ -15,8 +15,9 @@ class NetworkLottie extends LottieProvider {
final Map<String, String>? headers;
@override
Future<LottieComposition> load() {
return sharedLottieCache.putIfAbsent(this, () async {
Future<LottieComposition> load() async {
var cacheKey = 'network-$url';
return sharedLottieCache.putIfAbsent(cacheKey, () async {
var resolved = Uri.base.resolve(url);
var bytes = await network.loadHttp(resolved, headers: headers);

View File

@ -1,27 +0,0 @@
import 'package:flutter/widgets.dart';
extension CharactersExtension on Characters {
Characters trimTrailing(Characters pattern) {
if (pattern.isEmpty) return this;
var i = length;
while (i >= pattern.length && getRange(i - pattern.length, i) == pattern) {
i -= pattern.length;
}
return getRange(0, i);
}
Characters trimLeading(Characters pattern) {
if (pattern.isEmpty) return this;
var i = 0;
while (i <= length - pattern.length &&
getRange(i, i + pattern.length) == pattern) {
i += pattern.length;
}
return getRange(i);
}
Characters trim(Characters pattern) {
return trimLeading(pattern).trimTrailing(pattern);
}
}

View File

@ -1,61 +0,0 @@
/// Returns a position of the [value] in [sortedList], if it is there.
///
/// If the list isn't sorted according to the [compare] function, the result
/// is unpredictable.
///
/// If [compare] is omitted, this defaults to calling [Comparable.compareTo] on
/// the objects. In this case, the objects must be [Comparable].
///
/// Returns -1 if [value] is not in the list.
int binarySearch<E>(List<E> sortedList, E value,
{int Function(E, E)? compare}) {
compare ??= defaultCompare;
return binarySearchBy<E, E>(sortedList, identity, compare, value);
}
/// Returns a position of the [value] in [sortedList], if it is there.
///
/// If the list isn't sorted according to the [compare] function on the [keyOf]
/// property of the elements, the result is unpredictable.
///
/// Returns -1 if [value] is not in the list by default.
///
/// If [start] and [end] are supplied, only that range is searched,
/// and only that range need to be sorted.
int binarySearchBy<E, K>(List<E> sortedList, K Function(E element) keyOf,
int Function(K, K) compare, E value,
[int start = 0, int? end]) {
end = RangeError.checkValidRange(start, end, sortedList.length);
var min = start;
var max = end;
var key = keyOf(value);
while (min < max) {
var mid = min + ((max - min) >> 1);
var element = sortedList[mid];
var comp = compare(keyOf(element), key);
if (comp == 0) return mid;
if (comp < 0) {
min = mid + 1;
} else {
max = mid;
}
}
return -1;
}
/// A [Comparator] that asserts that its first argument is comparable.
///
/// The function behaves just like [List.sort]'s
/// default comparison function. It is entirely dynamic in its testing.
///
/// Should be used when optimistically comparing object that are assumed
/// to be comparable.
/// If the elements are known to be comparable, use [compareComparable].
int defaultCompare(Object? value1, Object? value2) =>
(value1! as Comparable<Object?>).compareTo(value2);
/// A reusable identity function at any type.
T identity<T>(T value) => value;
/// A reusable typed comparable comparator.
int compareComparable<T extends Comparable<T>>(T a, T b) => a.compareTo(b);

View File

@ -40,18 +40,6 @@ class Keyframe<T> {
xInterpolator = null,
yInterpolator = null;
Keyframe._(this.startValue, this.endValue)
: _composition = null,
interpolator = null,
xInterpolator = null,
yInterpolator = null,
startFrame = double.minPositive,
endFrame = double.maxFinite;
Keyframe<T> copyWith(T startValue, T endValue) {
return Keyframe<T>._(startValue, endValue);
}
double get startProgress {
if (_composition == null) {
return 0.0;

View File

@ -5,114 +5,177 @@ packages:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: e440ac42679dfc04bbbefb58ed225c994bc7e07fccc8a68ec7d3631a127e5da9
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "54.0.0"
version: "50.0.0"
analyzer:
dependency: "direct dev"
description:
name: analyzer
sha256: "2c2e3721ee9fb36de92faa060f3480c81b23e904352b087e5c64224b1a044427"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "5.6.0"
version: "5.2.0"
archive:
dependency: "direct main"
description:
name: archive
sha256: d6347d54a2d8028e0437e3c099f66fdb8ae02c4720c1e7534c9f24c10351f85d
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "3.3.6"
version: "3.3.2"
args:
dependency: transitive
description:
name: args
sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.4.0"
version: "2.3.1"
async:
dependency: transitive
description:
name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.10.0"
version: "2.9.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
version: "2.1.0"
build:
dependency: transitive
description:
name: build
url: "https://pub.dartlang.org"
source: hosted
version: "2.3.1"
build_config:
dependency: transitive
description:
name: build_config
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.1"
build_daemon:
dependency: transitive
description:
name: build_daemon
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
build_resolvers:
dependency: transitive
description:
name: build_resolvers
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
build_runner:
dependency: "direct dev"
description:
name: build_runner
url: "https://pub.dartlang.org"
source: hosted
version: "2.3.2"
build_runner_core:
dependency: transitive
description:
name: build_runner_core
url: "https://pub.dartlang.org"
source: hosted
version: "7.2.7"
built_collection:
dependency: transitive
description:
name: built_collection
url: "https://pub.dartlang.org"
source: hosted
version: "5.1.1"
built_value:
dependency: transitive
description:
name: built_value
url: "https://pub.dartlang.org"
source: hosted
version: "8.4.2"
characters:
dependency: transitive
description:
name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.1"
checked_yaml:
dependency: transitive
description:
name: checked_yaml
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
clock:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.1"
code_builder:
dependency: transitive
description:
name: code_builder
url: "https://pub.dartlang.org"
source: hosted
version: "4.3.0"
collection:
dependency: transitive
description:
name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.17.0"
version: "1.16.0"
convert:
dependency: transitive
description:
name: convert
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.1"
crypto:
dependency: transitive
description:
name: crypto
sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.2"
dart_style:
dependency: "direct dev"
description:
name: dart_style
sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.4"
fake_async:
dependency: transitive
description:
name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
file:
dependency: transitive
description:
name: file
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.4"
fixnum:
dependency: transitive
description:
name: fixnum
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
flutter:
dependency: "direct main"
description: flutter
@ -122,8 +185,7 @@ packages:
dependency: "direct dev"
description:
name: flutter_lints
sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
flutter_test:
@ -131,86 +193,153 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
frontend_server_client:
dependency: transitive
description:
name: frontend_server_client
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
glob:
dependency: transitive
description:
name: glob
sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
graphs:
dependency: transitive
description:
name: graphs
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.0"
http_multi_server:
dependency: transitive
description:
name: http_multi_server
url: "https://pub.dartlang.org"
source: hosted
version: "3.2.1"
http_parser:
dependency: transitive
description:
name: http_parser
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.2"
io:
dependency: transitive
description:
name: io
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.3"
js:
dependency: transitive
description:
name: js
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.5"
json_annotation:
dependency: transitive
description:
name: json_annotation
url: "https://pub.dartlang.org"
source: hosted
version: "4.7.0"
lints:
dependency: transitive
description:
name: lints
sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
logging:
dependency: transitive
description:
name: logging
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
matcher:
dependency: transitive
description:
name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.13"
version: "0.12.12"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0"
version: "0.1.5"
meta:
dependency: transitive
description:
name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
mime:
dependency: transitive
description:
name: mime
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
package_config:
dependency: transitive
description:
name: package_config
sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
path:
dependency: "direct main"
description:
name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.2"
pointycastle:
pool:
dependency: transitive
description:
name: pointycastle
sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346
url: "https://pub.dev"
name: pool
url: "https://pub.dartlang.org"
source: hosted
version: "3.6.2"
version: "1.5.1"
pub_semver:
dependency: transitive
dependency: "direct dev"
description:
name: pub_semver
sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
version: "2.1.2"
pubspec_parse:
dependency: transitive
description:
name: pubspec_parse
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.1"
shelf:
dependency: transitive
description:
name: shelf
url: "https://pub.dartlang.org"
source: hosted
version: "1.4.0"
shelf_web_socket:
dependency: transitive
description:
name: shelf_web_socket
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.3"
sky_engine:
dependency: transitive
description: flutter
@ -220,80 +349,91 @@ packages:
dependency: transitive
description:
name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.9.1"
version: "1.9.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.11.0"
version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
version: "2.1.0"
stream_transform:
dependency: transitive
description:
name: stream_transform
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
version: "1.1.1"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.1"
test_api:
dependency: transitive
description:
name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.16"
version: "0.4.12"
timing:
dependency: transitive
description:
name: timing
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
vector_math:
dependency: "direct main"
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.4"
version: "2.1.2"
watcher:
dependency: transitive
description:
name: watcher
sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
web_socket_channel:
dependency: transitive
description:
name: web_socket_channel
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.0"
yaml:
dependency: "direct dev"
description:
name: yaml
sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370"
url: "https://pub.dev"
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.1"
sdks:

View File

@ -1,6 +1,6 @@
name: lottie
description: Render After Effects animations natively on Flutter. This package is a pure Dart implementation of a Lottie player.
version: 2.3.0
version: 2.0.0
repository: https://github.com/xvrh/lottie-flutter
environment:
@ -16,8 +16,10 @@ dependencies:
dev_dependencies:
analyzer:
build_runner:
dart_style:
flutter_lints:
flutter_test:
sdk: flutter
pub_semver:
yaml:

View File

@ -1,35 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:lottie/src/utils/characters.dart';
void main() {
test('TrimTrailing characters', () {
expect('ab c d '.characters.trimTrailing(' '.characters),
'ab c d'.characters);
expect(' '.characters.trimTrailing(' '.characters), ''.characters);
expect(' a '.characters.trimTrailing(' '.characters), ' a'.characters);
expect(' aa'.characters.trimTrailing('a'.characters), ' '.characters);
expect('aabcbc'.characters.trimTrailing('bc'.characters), 'aa'.characters);
expect('bcbc'.characters.trimTrailing('bc'.characters), ''.characters);
expect(''.characters.trimTrailing(' '.characters), ''.characters);
expect(''.characters.trimTrailing('bc'.characters), ''.characters);
expect(' '.characters.trimTrailing('bc'.characters), ' '.characters);
expect(' bc'.characters.trimTrailing('bc'.characters), ' '.characters);
});
test('TrimLeading characters', () {
expect(' ab '.characters.trimLeading(' '.characters), 'ab '.characters);
expect(' '.characters.trimLeading(' '.characters), ''.characters);
expect(' '.characters.trimLeading(' '.characters), ''.characters);
expect(' a'.characters.trimLeading(' '.characters), 'a'.characters);
expect('abc'.characters.trimLeading('ab'.characters), 'c'.characters);
expect('ababc'.characters.trimLeading('ab'.characters), 'c'.characters);
expect('abab'.characters.trimLeading('ab'.characters), ''.characters);
expect('ababcd'.characters.trimLeading('ab'.characters), 'cd'.characters);
expect(''.characters.trimLeading(''.characters), ''.characters);
});
test('Trim characters', () {
expect(' ab '.characters.trim(' '.characters), 'ab'.characters);
});
}

View File

@ -1,689 +0,0 @@
{
"v": "5.6.6",
"ip": 0,
"op": 1,
"fr": 60,
"w": 953,
"h": 272,
"layers": [
{
"ind": 2345,
"nm": "surface13687",
"ao": 0,
"ip": 0,
"op": 60,
"st": 0,
"ty": 4,
"ks": {
"ty": "tr",
"o": { "k": 100 },
"r": { "k": 0 },
"p": { "k": [0, 0] },
"a": { "k": [0, 0] },
"s": { "k": [133.33, 133.33] },
"sk": { "k": 0 },
"sa": { "k": 0 }
},
"shapes": [
{
"ty": "gr",
"hd": false,
"nm": "surface13687",
"it": [
{
"ty": "gr",
"hd": false,
"it": [
{
"ty": "sh",
"ks": {
"k": {
"i": [
[0, 0],
[0, 0],
[0, 0],
[20, -0.05],
[0.73, 0.64],
[0, 0]
],
"o": [
[0, 0],
[0, 0],
[-20.01, 0.05],
[-1.14, 0.25],
[0, 0],
[0, 0]
],
"v": [
[79.56, 177.9],
[110.31, 147.43],
[163.43, 200.61],
[103.41, 200.64],
[100.84, 199.21],
[79.55, 177.9]
],
"c": true
}
}
},
{
"ty": "fl",
"o": { "k": 100 },
"c": { "k": [0.03, 0.35, 0.61, 1] }
},
{
"ty": "tr",
"o": { "k": 100 },
"r": { "k": 0 },
"p": { "k": [0, 0] },
"a": { "k": [0, 0] },
"s": { "k": [100, 100] },
"sk": { "k": 0 },
"sa": { "k": 0 },
"hd": false
}
]
},
{
"ty": "gr",
"hd": false,
"it": [
{
"ty": "sh",
"ks": {
"k": {
"i": [
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[49.02, 147.35],
[79.55, 116.86],
[110.18, 147.3],
[110.31, 147.43],
[79.56, 177.9]
],
"c": true
}
}
},
{
"ty": "fl",
"o": { "k": 100 },
"c": { "k": [0.12, 0.74, 0.99, 1] }
},
{
"ty": "tr",
"o": { "k": 100 },
"r": { "k": 0 },
"p": { "k": [0, 0] },
"a": { "k": [0, 0] },
"s": { "k": [100, 100] },
"sk": { "k": 0 },
"sa": { "k": 0 },
"hd": false
}
]
},
{
"ty": "gr",
"hd": false,
"it": [
{
"ty": "sh",
"ks": {
"k": {
"i": [
[0, 0],
[0, 0],
[0, 0],
[17.48, -0.07],
[0.15, -1.03],
[0, 0],
[-1.04, -0.16],
[0, 0],
[0, 0],
[13.93, -0.01],
[2.05, -0.36],
[0, 0],
[4.49, 0.1],
[0, 0],
[0, 0]
],
"o": [
[0, 0],
[0, 0],
[-17.47, 0],
[-1.34, 0.44],
[0, 0],
[0.44, 1.33],
[0, 0],
[0, 0],
[-13.93, -0.01],
[-2.07, -0.01],
[0, 0],
[-4.49, -0.18],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[249.55, 45.91],
[316.33, 45.93],
[316.32, 59.08],
[263.9, 59.1],
[263.05, 62.24],
[263.1, 97.61],
[266.25, 98.46],
[311.07, 98.44],
[311.07, 111.57],
[269.28, 111.57],
[263.07, 111.79],
[262.91, 161.71],
[249.44, 161.6],
[249.43, 48.03],
[249.55, 45.91]
],
"c": true
}
}
},
{
"ty": "sh",
"ks": {
"k": {
"i": [
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[4.45, -0.12],
[0, 1.84],
[0, 0]
],
"o": [
[0, 0],
[0, 0],
[0, 0],
[-4.46, -0.08],
[-0.34, -1.83],
[0, 0],
[0, 0]
],
"v": [
[332.52, 45.93],
[346.23, 45.93],
[346.24, 124.5],
[346.09, 161.5],
[332.71, 161.51],
[332.51, 155.98],
[332.52, 45.93]
],
"c": true
}
}
},
{
"ty": "sh",
"ks": {
"k": {
"i": [
[0, 0],
[0, 0],
[0, 0],
[-6.71, -0.54],
[0.07, -4.17],
[6.68, 0.1],
[0, 0],
[-4.17, -2.21],
[-4.51, 2.61],
[0, 0],
[5.33, 0.73],
[2.27, 7.45],
[0.03, 4.26],
[0, 0],
[0, 0],
[4.75, 0.17],
[-0.27, 4.24],
[-4.82, 0.37]
],
"o": [
[0, 0],
[0, 0],
[6.73, 0.16],
[-0.19, 4.17],
[-6.69, 0.02],
[0, 0],
[0.14, 4.29],
[4.76, 2.71],
[0, 0],
[-4.96, 2.25],
[-7.52, -1.15],
[-1.51, -4.08],
[0, 0],
[0, 0],
[-4.75, -0.25],
[0.03, -4.25],
[4.83, -0.08],
[0, 0]
],
"v": [
[466.71, 55.67],
[480.46, 55.68],
[480.49, 78.93],
[500.69, 79.16],
[500.59, 91.68],
[480.53, 91.64],
[480.48, 137.95],
[485.71, 149.63],
[500.83, 148.46],
[500.83, 161.93],
[484.87, 163.72],
[467.88, 150],
[466.69, 137.26],
[466.66, 92.16],
[466.32, 91.78],
[452.05, 91.65],
[452.16, 78.92],
[466.66, 78.77]
],
"c": true
}
}
},
{
"ty": "sh",
"ks": {
"k": {
"i": [
[0, 0],
[-4.57, -0.16],
[0, 0],
[-0.41, -7.62],
[-6.51, 0.04],
[0, 0],
[6.55, 0.04],
[0, 0],
[-3.97, -2.02],
[-4.52, 2.71],
[0, 0],
[5.2, 0.6],
[3.18, 6.19],
[0.14, 3.58],
[0, 0],
[4.74, 0.02],
[0, 0],
[-4.67, -0.16],
[-0.29, 7.79]
],
"o": [
[4.57, 0.16],
[0, 0],
[0.17, 7.64],
[6.52, -0.12],
[0, 0],
[-6.55, 0.25],
[0, 0],
[-0.01, 4.1],
[4.87, 2.66],
[0, 0],
[-4.82, 2.18],
[-6.76, -0.9],
[-1.53, -3.24],
[0, 0],
[-4.75, -0.01],
[0, 0],
[4.67, 0.13],
[0.5, -7.77],
[0, 0]
],
"v": [
[524.82, 55.62],
[538.54, 55.73],
[538.86, 56.07],
[539.04, 78.99],
[558.58, 78.93],
[558.63, 91.57],
[538.94, 91.63],
[538.87, 138.74],
[544.01, 149.71],
[559.3, 148.29],
[559.29, 161.84],
[543.82, 163.83],
[527.28, 152.93],
[524.75, 142.52],
[524.75, 91.69],
[510.52, 91.69],
[510.55, 78.89],
[524.57, 79.01],
[524.82, 55.63]
],
"c": true
}
}
},
{
"ty": "sh",
"ks": {
"k": {
"i": [
[0, 0],
[-9.7, -3.3],
[-3.15, -11.24],
[0.29, -6.48],
[0, 0],
[-4.83, -5.22],
[-9.97, 3.14],
[-3.59, 6.19],
[-3.96, -1.82],
[11.57, -2.22],
[8.71, 4.7],
[2.22, 12.3],
[-3.55, 8.97],
[-9.7, 4.25]
],
"o": [
[9.5, -3.94],
[11.11, 3.83],
[2.06, 6.23],
[0, 0],
[0.54, 6.95],
[6.86, 8],
[7, -2.06],
[3.98, 1.78],
[-5.41, 10.32],
[-9.5, 1.78],
[-11.31, -5.62],
[-1.61, -9.45],
[3.73, -9.85],
[0, 0]
],
"v": [
[591.59, 79.36],
[621.73, 78.65],
[644.59, 103.42],
[646.27, 122.75],
[580.98, 122.82],
[588.43, 142.08],
[617.08, 149.91],
[633.13, 136.27],
[644.93, 141.9],
[618.09, 162.64],
[589.48, 159.77],
[568.16, 130.41],
[570.61, 101.99],
[591.58, 79.36]
],
"c": false
}
}
},
{
"ty": "sh",
"ks": {
"k": {
"i": [
[0, 0],
[1.61, -8.46],
[0, 0],
[4.05, 4],
[9.3, -4.04]
],
"o": [
[-7.99, 3.69],
[0, 0],
[-0.8, -5.53],
[-7.09, -7.61],
[0, 0]
],
"v": [
[596.75, 91.22],
[582.01, 111.57],
[632.08, 111.41],
[625.27, 96.27],
[596.75, 91.23]
],
"c": true
}
}
},
{
"ty": "sh",
"ks": {
"k": {
"i": [
[0, 0],
[-12.7, -5.32],
[0, 0],
[5.63, -1.66],
[2.18, -7.55],
[-0.06, -5.23],
[0.44, -6.76],
[-0.5, -5.85],
[4.66, -0.16],
[0.07, 17.64],
[0, 0],
[-4.38, -0.11],
[-0.73, -4.37]
],
"o": [
[5.23, -12.7],
[0, 0],
[-5.33, -2.1],
[-7.7, 2.29],
[-1.5, 5.1],
[-0.59, 6.77],
[0.36, 5.84],
[-4.66, 0.23],
[-0.27, -17.63],
[0, 0],
[4.37, 0.12],
[0.4, 4.38],
[0, 0]
],
"v": [
[675.99, 92.31],
[709.98, 78.26],
[709.98, 93.08],
[693.04, 91.34],
[677.46, 108.05],
[676.59, 123.7],
[676.44, 144],
[676.62, 161.54],
[662.63, 161.68],
[662.52, 108.76],
[662.62, 79.07],
[675.75, 79.16],
[675.99, 92.31]
],
"c": true
}
}
},
{
"ty": "sh",
"ks": {
"k": {
"i": [
[0, 0],
[-4.63, -0.52],
[0, 0],
[-4.16, -4.66],
[-7.34, 2.35],
[0.39, 10.38],
[0, 0],
[0, 0],
[0, 0],
[4.43, 0.05],
[0, 0],
[4.12, -2.27],
[9.44, 2.72],
[3.05, 5.58],
[0.21, 6.99],
[0, 0]
],
"o": [
[4.65, 0.2],
[0, 0],
[-0.05, 6.01],
[5.36, 5.94],
[9.8, -3.51],
[0, 0],
[0, 0],
[0, 0],
[-4.44, -0.07],
[0, 0],
[-2.87, 3.61],
[-8.43, 5.32],
[-6.09, -1.84],
[-3.62, -6.14],
[0, 0],
[0, 0]
],
"v": [
[365.89, 78.91],
[379.86, 79.15],
[379.79, 128.31],
[384.75, 145.54],
[406.54, 150.22],
[422.78, 125.95],
[422.93, 78.91],
[436.93, 78.94],
[436.85, 161.48],
[423.55, 161.43],
[423.5, 149.68],
[413.49, 159.21],
[384.93, 162.51],
[370.48, 150.83],
[365.73, 130.45],
[365.9, 78.91]
],
"c": true
}
}
},
{ "ty": "fl", "o": { "k": 54 }, "c": { "k": [0, 0, 0, 1] } },
{
"ty": "tr",
"o": { "k": 100 },
"r": { "k": 0 },
"p": { "k": [0, 0] },
"a": { "k": [0, 0] },
"s": { "k": [100, 100] },
"sk": { "k": 0 },
"sa": { "k": 0 },
"hd": false
}
]
},
{
"ty": "gr",
"hd": false,
"it": [
{
"ty": "sh",
"ks": {
"k": {
"i": [
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[102.21, 3.07],
[163.46, 3],
[60.7, 105.71],
[33.92, 132.34],
[3.45, 101.83]
],
"c": true
}
}
},
{
"ty": "sh",
"ks": {
"k": {
"i": [
[0, 0],
[-1.11, 0.14],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0.8, -1.05],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[101.64, 94.78],
[105.01, 94.11],
[163.41, 94.12],
[110.18, 147.3],
[79.55, 116.86],
[101.64, 94.78]
],
"c": true
}
}
},
{
"ty": "fl",
"o": { "k": 100 },
"c": { "k": [0.27, 0.82, 0.99, 1] }
},
{
"ty": "tr",
"o": { "k": 100 },
"r": { "k": 0 },
"p": { "k": [0, 0] },
"a": { "k": [0, 0] },
"s": { "k": [100, 100] },
"sk": { "k": 0 },
"sa": { "k": 0 },
"hd": false
}
]
},
{
"ty": "tr",
"o": { "k": 100 },
"r": { "k": 0 },
"p": { "k": [0, 0] },
"a": { "k": [0, 0] },
"s": { "k": [100, 100] },
"sk": { "k": 0 },
"sa": { "k": 0 },
"hd": false
}
]
}
]
}
],
"meta": { "g": "LF SVG to Lottie" }
}

View File

@ -35,10 +35,10 @@ void main() {
tester.binding.window.physicalSizeTestValue = size;
tester.binding.window.devicePixelRatioTestValue = 1.0;
var image = await tester.runAsync(() async =>
var image = await tester.runAsync(() =>
loadImage(FileImage(File('example/assets/Images/WeAccept/img_0.png'))));
var composition = (await tester.runAsync(() async =>
var composition = (await tester.runAsync(() =>
FileLottie(File('example/assets/spinning_carrousel.zip')).load()))!;
var delegates = LottieDelegates(image: (composition, asset) {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Some files were not shown because too many files have changed in this diff Show More