Compare commits
27 Commits
v0.3.2
...
update-gol
Author | SHA1 | Date | |
---|---|---|---|
e303633132 | |||
7fe343d819 | |||
cb8006d362 | |||
bf7d0ebf05 | |||
57faea6f5e | |||
548c77dc45 | |||
45a4c0b981 | |||
32b1181dad | |||
fcfe54686d | |||
b9aba4dce2 | |||
2cb1aefb2a | |||
478bd27e89 | |||
ef06d63040 | |||
0715f6a402 | |||
7e81ec3f69 | |||
f9f093a8a2 | |||
7c137ee55f | |||
8f4952a23a | |||
8bad4f96c0 | |||
bb73626c46 | |||
47e47f5cb8 | |||
954ec05598 | |||
66e644d043 | |||
3dab382b76 | |||
078e661fd4 | |||
336890cafe | |||
35ca2dc972 |
@ -10,8 +10,8 @@ jobs:
|
|||||||
name: Flutter analyze
|
name: Flutter analyze
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
flutter: ['stable', 'dev']
|
flutter: ['stable']
|
||||||
runs-on: macos-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: subosito/flutter-action@v1
|
- uses: subosito/flutter-action@v1
|
||||||
@ -22,9 +22,6 @@ jobs:
|
|||||||
- run: flutter pub get
|
- run: flutter pub get
|
||||||
working-directory: example
|
working-directory: example
|
||||||
- run: flutter analyze
|
- run: flutter analyze
|
||||||
- run: flutter test test # https://github.com/flutter/flutter/issues/20907
|
|
||||||
- run: flutter test test
|
|
||||||
working-directory: example
|
|
||||||
- run: flutter pub run tool/prepare_submit.dart
|
- run: flutter pub run tool/prepare_submit.dart
|
||||||
- name: "check for uncommitted changes"
|
- name: "check for uncommitted changes"
|
||||||
run: |
|
run: |
|
17
.github/workflows/test.yaml
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
name: Lottie Flutter
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
name: Run all tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Run tests
|
||||||
|
uses: docker://cirrusci/flutter:1.22.1
|
||||||
|
with:
|
||||||
|
args: sh run_tests.sh
|
81
CHANGELOG.md
@ -1,47 +1,102 @@
|
|||||||
## [0.3.2] - 2020-03-16
|
## [0.7.0+1]
|
||||||
|
- Fix Flutter Web compilation error
|
||||||
|
|
||||||
|
## [0.7.0]
|
||||||
|
- Performance improvement for complex animations.
|
||||||
|
|
||||||
|
## [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
|
||||||
|
(`FrameRate.max`).
|
||||||
|
- Automatically add a `RepaintBoundary` around the widget. Since `Lottie` animations are generally complex to paint, a
|
||||||
|
`RepaintBoundary` will separate the animation with the rest of the app and improve performance. A new property `addRepaintBoundary`
|
||||||
|
allows to opt-out this behavior.
|
||||||
|
- 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]
|
||||||
|
- Remove direct dependencies on dart:io to support Flutter Web
|
||||||
|
|
||||||
|
## [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]
|
||||||
|
- Support color value stored as RGB, not RGBA
|
||||||
|
|
||||||
|
## [0.4.0+1]
|
||||||
|
- Support latest version of the `characters` package
|
||||||
|
|
||||||
|
## [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
|
||||||
|
first shape. If you need to cut out one shape from another shape, use an even-odd fill type
|
||||||
|
instead of using merge paths.
|
||||||
|
|
||||||
|
Merge paths can be enabled with:
|
||||||
|
```dart
|
||||||
|
Lottie.asset('file.json', options: LottieOptions(enableMergePaths: true));
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## [0.3.6]
|
||||||
|
- Export the `Marker` class
|
||||||
|
|
||||||
|
## [0.3.5]
|
||||||
|
- Fix a bug with a wrongly clipped rectangle.
|
||||||
|
|
||||||
|
## [0.3.4]
|
||||||
|
- Fix a bug with dashed path
|
||||||
|
|
||||||
|
## [0.3.3]
|
||||||
|
- Fix a bug with rounded rectangle shape
|
||||||
|
|
||||||
|
## [0.3.2]
|
||||||
- Fix a bug with "repeater" content
|
- Fix a bug with "repeater" content
|
||||||
|
|
||||||
## [0.3.1] - 2020-03-05
|
## [0.3.1]
|
||||||
- Support dashed path
|
- Support dashed path
|
||||||
|
|
||||||
## [0.3.0+1] - 2020-03-05
|
## [0.3.0+1]
|
||||||
- Specify a version range for the dependency on `characters`.
|
- Specify a version range for the dependency on `characters`.
|
||||||
|
|
||||||
## [0.3.0] - 2020-03-05
|
## [0.3.0]
|
||||||
- Add `LottieDelegates` a group of options to customize the lottie animation at runtime.
|
- 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.
|
ie: Dynamically modify color, position, size, text... of every elements of the animation.
|
||||||
- Correctly display Linear and Radial Gradients
|
- Correctly display Linear and Radial Gradients
|
||||||
- Integrate latest changes from Lottie-android
|
- Integrate latest changes from Lottie-android
|
||||||
|
|
||||||
## [0.2.2] - 2020-02-21
|
## [0.2.2]
|
||||||
- Add a [repeat] parameter to specify if the automatic animation should loop.
|
- Add a [repeat] parameter to specify if the automatic animation should loop.
|
||||||
- Add the [animate], [reverse], [repeat] properties on `LottieBuilder`
|
- Add the [animate], [reverse], [repeat] properties on `LottieBuilder`
|
||||||
- Fix bug with `onLoaded` callback when the `LottieProvider` is changed
|
- Fix bug with `onLoaded` callback when the `LottieProvider` is changed
|
||||||
|
|
||||||
## [0.2.1] - 2020-02-11
|
## [0.2.1]
|
||||||
- Fix a big bug in the path transformation code. A lot more animations look correct now.
|
- Fix a big bug in the path transformation code. A lot more animations look correct now.
|
||||||
|
|
||||||
## [0.2.0+1] - 2020-02-04
|
## [0.2.0+1]
|
||||||
- Improve readme
|
- Improve readme
|
||||||
- (internal) Add golden tests
|
- (internal) Add golden tests
|
||||||
|
|
||||||
## [0.2.0] - 2020-02-02
|
## [0.2.0]
|
||||||
- Support loading the animation and its images from a zip file
|
- Support loading the animation and its images from a zip file
|
||||||
- Breaking: `LottieComposition.fromBytes` and `fromByteData` are now asynchronous.
|
- Breaking: `LottieComposition.fromBytes` and `fromByteData` are now asynchronous.
|
||||||
|
|
||||||
## [0.1.4] - 2020-02-02
|
## [0.1.4]
|
||||||
- Support images in animation
|
- Support images in animation
|
||||||
- Basic support for text in animation (work in progress)
|
- Basic support for text in animation (work in progress)
|
||||||
|
|
||||||
## [0.1.3] - 2020-02-01
|
## [0.1.3]
|
||||||
- Support Polystar shape
|
- Support Polystar shape
|
||||||
- Reorganize examples.
|
- Reorganize examples.
|
||||||
|
|
||||||
## [0.1.2] - 2020-01-31
|
## [0.1.2]
|
||||||
- Implement `Lottie.network`, `Lottie.file` and `Lottie.memory`
|
- Implement `Lottie.network`, `Lottie.file` and `Lottie.memory`
|
||||||
|
|
||||||
## [0.1.1] - 2020-01-31
|
## [0.1.1]
|
||||||
- Fix analysis lints
|
- Fix analysis lints
|
||||||
|
|
||||||
## [0.1.0] - 2020-01-31
|
## [0.1.0]
|
||||||
- Initial conversion of [lottie-android](https://github.com/airbnb/lottie-android) to Dart/Flutter
|
- Initial conversion of [lottie-android](https://github.com/airbnb/lottie-android) to Dart/Flutter
|
||||||
|
7
CONTRIBUTING.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
## Run the Golden tests
|
||||||
|
Run and update the golden tests requires Docker installed.
|
||||||
|
|
||||||
|
```shell script
|
||||||
|
sh update_goldens.sh
|
||||||
|
```
|
65
README.md
@ -3,12 +3,12 @@
|
|||||||
[](https://github.com/xvrh/lottie-flutter)
|
[](https://github.com/xvrh/lottie-flutter)
|
||||||
[](https://pub.dev/packages/lottie)
|
[](https://pub.dev/packages/lottie)
|
||||||
|
|
||||||
Lottie is a mobile library for Android and iOS that parses [Adobe After Effects](http://www.adobe.com/products/aftereffects.html)
|
Lottie is a mobile library for Android and iOS that parses [Adobe After Effects](https://www.adobe.com/products/aftereffects.html)
|
||||||
animations exported as json with [Bodymovin](https://github.com/airbnb/lottie-web) and renders them natively on mobile!
|
animations exported as json with [Bodymovin](https://github.com/airbnb/lottie-web) and renders them natively on mobile!
|
||||||
|
|
||||||
This repository is a unofficial conversion of the [Lottie-android](https://github.com/airbnb/lottie-android) library in pure Dart.
|
This repository is a unofficial conversion of the [Lottie-android](https://github.com/airbnb/lottie-android) library in pure Dart.
|
||||||
|
|
||||||
It works on Android, iOS and macOS. ([Web support is coming](https://github.com/xvrh/lottie-flutter#flutter-web))
|
It works on Android, iOS, macOS, linux, windows and web.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
@ -49,6 +49,9 @@ class MyApp extends StatelessWidget {
|
|||||||
### Specify a custom `AnimationController`
|
### Specify a custom `AnimationController`
|
||||||
This example shows how to take full control over the animation by providing your own `AnimationController`.
|
This example shows how to take full control over the animation by providing your own `AnimationController`.
|
||||||
|
|
||||||
|
With a custom `AnimationController` you have a rich API to play the animation in various ways: start and stop the animation when you want,
|
||||||
|
play forward or backward, loop between specifics points...
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lottie/lottie.dart';
|
import 'package:lottie/lottie.dart';
|
||||||
@ -82,8 +85,8 @@ class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
|
|||||||
home: Scaffold(
|
home: Scaffold(
|
||||||
body: ListView(
|
body: ListView(
|
||||||
children: [
|
children: [
|
||||||
Lottie.network(
|
Lottie.asset(
|
||||||
'https://raw.githubusercontent.com/xvrh/lottie-flutter/master/example/assets/Mobilo/C.json',
|
'assets/LottieLogo1.json',
|
||||||
controller: _controller,
|
controller: _controller,
|
||||||
onLoaded: (composition) {
|
onLoaded: (composition) {
|
||||||
// Configure the AnimationController with the duration of the
|
// Configure the AnimationController with the duration of the
|
||||||
@ -101,6 +104,8 @@ class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
[See this file](https://github.com/xvrh/lottie-flutter/blob/master/example/lib/examples/animation_full_control.dart) for a more comprehensive example.
|
||||||
|
|
||||||
### Control the size of the Widget
|
### Control the size of the Widget
|
||||||
The `Lottie` widget takes the same arguments and have the same behavior as the `Image` widget
|
The `Lottie` widget takes the same arguments and have the same behavior as the `Image` widget
|
||||||
in term of controlling its size.
|
in term of controlling its size.
|
||||||
@ -117,13 +122,14 @@ Lottie.asset(
|
|||||||
animation.
|
animation.
|
||||||
|
|
||||||
### Custom loading
|
### Custom loading
|
||||||
This example shows how to load and parse a Lottie composition from a json file.
|
|
||||||
|
|
||||||
The `Lottie` widget has several convenient constructors (`Lottie.asset`, `Lottie.network`, `Lottie.memory`) to load, parse and
|
The `Lottie` widget has several convenient constructors (`Lottie.asset`, `Lottie.network`, `Lottie.memory`) to load, parse and
|
||||||
cache automatically the json file.
|
cache automatically the json file.
|
||||||
|
|
||||||
Sometime you may prefer to have full control over the loading of the file. Use `LottieComposition.fromByteData` to
|
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.
|
parse the file from a list of bytes.
|
||||||
|
|
||||||
|
This example shows how to load and parse a Lottie composition from a json file.
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
class MyWidget extends StatefulWidget {
|
class MyWidget extends StatefulWidget {
|
||||||
@override
|
@override
|
||||||
@ -182,14 +188,13 @@ class CustomDrawer extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _Painter extends CustomPainter {
|
class _Painter extends CustomPainter {
|
||||||
final LottieComposition composition;
|
final LottieDrawable drawable;
|
||||||
|
|
||||||
_Painter(this.composition);
|
_Painter(LottieComposition composition)
|
||||||
|
: drawable = LottieDrawable(composition);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void paint(Canvas canvas, Size size) {
|
void paint(Canvas canvas, Size size) {
|
||||||
var drawable = LottieDrawable(composition);
|
|
||||||
|
|
||||||
var frameCount = 40;
|
var frameCount = 40;
|
||||||
var columns = 10;
|
var columns = 10;
|
||||||
for (var i = 0; i < frameCount; i++) {
|
for (var i = 0; i < frameCount; i++) {
|
||||||
@ -219,39 +224,35 @@ class _Animation extends StatelessWidget {
|
|||||||
return Lottie.asset(
|
return Lottie.asset(
|
||||||
'assets/Tests/Shapes.json',
|
'assets/Tests/Shapes.json',
|
||||||
delegates: LottieDelegates(
|
delegates: LottieDelegates(
|
||||||
text: (initialText) => translate(initialText),
|
text: (initialText) => '**$initialText**',
|
||||||
values: [
|
values: [
|
||||||
ValueDelegate.color(
|
ValueDelegate.color(
|
||||||
const ['Shape Layer 1', 'Rectangle', 'Fill 1'],
|
const ['Shape Layer 1', 'Rectangle', 'Fill 1'],
|
||||||
value: Colors.red,
|
value: Colors.red,
|
||||||
),
|
),
|
||||||
ValueDelegate.opacity(
|
ValueDelegate.opacity(
|
||||||
const ['Shape Layer 1', 'Rectangle'],
|
const ['Shape Layer 1', 'Rectangle'],
|
||||||
callback: (frameInfo) =>
|
callback: (frameInfo) => (frameInfo.overallProgress * 100).round(),
|
||||||
(frameInfo.overallProgress * 100).round(),
|
),
|
||||||
),
|
ValueDelegate.position(
|
||||||
ValueDelegate.position(
|
const ['Shape Layer 1', 'Rectangle', '**'],
|
||||||
const ['Shape Layer 1', 'Rectangle'],
|
relative: Offset(100, 200),
|
||||||
relative: Offset(100, 200),
|
),
|
||||||
),
|
],
|
||||||
]),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
````
|
````
|
||||||
|
|
||||||
## Limitations
|
## Limitations
|
||||||
This is a new library so usability, documentation and performance are still work in progress.
|
|
||||||
|
|
||||||
Only the [supported features of Lottie Android](https://airbnb.io/lottie/#/supported-features)
|
Only the [supported features of Lottie Android](https://airbnb.io/lottie/#/supported-features)
|
||||||
are supported in this port.
|
are supported in this port.
|
||||||
|
|
||||||
## Flutter Web
|
## Flutter Web
|
||||||
Run the app with `flutter run -d Chrome --dart-define=FLUTTER_WEB_USE_SKIA=true --release`
|
Run the app with `flutter run -d Chrome --dart-define=FLUTTER_WEB_USE_SKIA=true --release`
|
||||||
|
|
||||||
The performance are not great and some features are missing.
|
|
||||||
|
|
||||||
See a preview here: https://xvrh.github.io/lottie-flutter/index.html
|
See a preview here: https://xvrh.github.io/lottie-flutter/index.html
|
||||||
|
|
||||||
## Complete example
|
## More examples
|
||||||
See the Sample app (in the `example` folder) for a complete example of the various possibilities.
|
See the `example` folder for more code samples of the various possibilities.
|
||||||
|
@ -3,12 +3,12 @@
|
|||||||
[](https://github.com/xvrh/lottie-flutter)
|
[](https://github.com/xvrh/lottie-flutter)
|
||||||
[](https://pub.dev/packages/lottie)
|
[](https://pub.dev/packages/lottie)
|
||||||
|
|
||||||
Lottie is a mobile library for Android and iOS that parses [Adobe After Effects](http://www.adobe.com/products/aftereffects.html)
|
Lottie is a mobile library for Android and iOS that parses [Adobe After Effects](https://www.adobe.com/products/aftereffects.html)
|
||||||
animations exported as json with [Bodymovin](https://github.com/airbnb/lottie-web) and renders them natively on mobile!
|
animations exported as json with [Bodymovin](https://github.com/airbnb/lottie-web) and renders them natively on mobile!
|
||||||
|
|
||||||
This repository is a unofficial conversion of the [Lottie-android](https://github.com/airbnb/lottie-android) library in pure Dart.
|
This repository is a unofficial conversion of the [Lottie-android](https://github.com/airbnb/lottie-android) library in pure Dart.
|
||||||
|
|
||||||
It works on Android, iOS and macOS. ([Web support is coming](https://github.com/xvrh/lottie-flutter#flutter-web))
|
It works on Android, iOS, macOS, linux, windows and web.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
@ -17,16 +17,21 @@ This example shows how to display a Lottie animation in the simplest way.
|
|||||||
The `Lottie` widget will load the json file and run the animation indefinitely.
|
The `Lottie` widget will load the json file and run the animation indefinitely.
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
import 'example/lib/examples/main.dart';
|
import 'example/lib/main.dart';
|
||||||
```
|
```
|
||||||
|
|
||||||
### Specify a custom `AnimationController`
|
### Specify a custom `AnimationController`
|
||||||
This example shows how to take full control over the animation by providing your own `AnimationController`.
|
This example shows how to take full control over the animation by providing your own `AnimationController`.
|
||||||
|
|
||||||
|
With a custom `AnimationController` you have a rich API to play the animation in various ways: start and stop the animation when you want,
|
||||||
|
play forward or backward, loop between specifics points...
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
import 'example/lib/examples/animation_controller.dart';
|
import 'example/lib/examples/animation_controller.dart';
|
||||||
```
|
```
|
||||||
|
|
||||||
|
[See this file](https://github.com/xvrh/lottie-flutter/blob/master/example/lib/examples/animation_full_control.dart) for a more comprehensive example.
|
||||||
|
|
||||||
### Control the size of the Widget
|
### Control the size of the Widget
|
||||||
The `Lottie` widget takes the same arguments and have the same behavior as the `Image` widget
|
The `Lottie` widget takes the same arguments and have the same behavior as the `Image` widget
|
||||||
in term of controlling its size.
|
in term of controlling its size.
|
||||||
@ -43,13 +48,14 @@ Lottie.asset(
|
|||||||
animation.
|
animation.
|
||||||
|
|
||||||
### Custom loading
|
### Custom loading
|
||||||
This example shows how to load and parse a Lottie composition from a json file.
|
|
||||||
|
|
||||||
The `Lottie` widget has several convenient constructors (`Lottie.asset`, `Lottie.network`, `Lottie.memory`) to load, parse and
|
The `Lottie` widget has several convenient constructors (`Lottie.asset`, `Lottie.network`, `Lottie.memory`) to load, parse and
|
||||||
cache automatically the json file.
|
cache automatically the json file.
|
||||||
|
|
||||||
Sometime you may prefer to have full control over the loading of the file. Use `LottieComposition.fromByteData` to
|
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.
|
parse the file from a list of bytes.
|
||||||
|
|
||||||
|
This example shows how to load and parse a Lottie composition from a json file.
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
import 'example/lib/examples/custom_load.dart#example';
|
import 'example/lib/examples/custom_load.dart#example';
|
||||||
```
|
```
|
||||||
@ -72,17 +78,13 @@ import 'example/lib/examples/simple_dynamic_properties.dart#example';
|
|||||||
````
|
````
|
||||||
|
|
||||||
## Limitations
|
## Limitations
|
||||||
This is a new library so usability, documentation and performance are still work in progress.
|
|
||||||
|
|
||||||
Only the [supported features of Lottie Android](https://airbnb.io/lottie/#/supported-features)
|
Only the [supported features of Lottie Android](https://airbnb.io/lottie/#/supported-features)
|
||||||
are supported in this port.
|
are supported in this port.
|
||||||
|
|
||||||
## Flutter Web
|
## Flutter Web
|
||||||
Run the app with `flutter run -d Chrome --dart-define=FLUTTER_WEB_USE_SKIA=true --release`
|
Run the app with `flutter run -d Chrome --dart-define=FLUTTER_WEB_USE_SKIA=true --release`
|
||||||
|
|
||||||
The performance are not great and some features are missing.
|
|
||||||
|
|
||||||
See a preview here: https://xvrh.github.io/lottie-flutter/index.html
|
See a preview here: https://xvrh.github.io/lottie-flutter/index.html
|
||||||
|
|
||||||
## Complete example
|
## More examples
|
||||||
See the Sample app (in the `example` folder) for a complete example of the various possibilities.
|
See the `example` folder for more code samples of the various possibilities.
|
||||||
|
1
example/assets/TwitterHeartButton.json
Normal file
1
example/assets/bluetoothscanning.json
Normal file
833
example/assets/example_with_images/data.json
Normal file
@ -0,0 +1,833 @@
|
|||||||
|
{
|
||||||
|
"v": "5.6.9",
|
||||||
|
"fr": 25,
|
||||||
|
"ip": 0,
|
||||||
|
"op": 75,
|
||||||
|
"w": 1200,
|
||||||
|
"h": 1200,
|
||||||
|
"nm": "Character-side v1",
|
||||||
|
"ddd": 0,
|
||||||
|
"assets": [
|
||||||
|
{
|
||||||
|
"id": "image_0",
|
||||||
|
"w": 1200,
|
||||||
|
"h": 1200,
|
||||||
|
"u": "images/",
|
||||||
|
"p": "img_0.png",
|
||||||
|
"e": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "image_1",
|
||||||
|
"w": 1200,
|
||||||
|
"h": 1200,
|
||||||
|
"u": "images/",
|
||||||
|
"p": "img_1.png",
|
||||||
|
"e": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "image_2",
|
||||||
|
"w": 1200,
|
||||||
|
"h": 1200,
|
||||||
|
"u": "images/",
|
||||||
|
"p": "img_2.png",
|
||||||
|
"e": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "image_3",
|
||||||
|
"w": 1200,
|
||||||
|
"h": 1200,
|
||||||
|
"u": "images/",
|
||||||
|
"p": "img_3.png",
|
||||||
|
"e": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "image_4",
|
||||||
|
"w": 1200,
|
||||||
|
"h": 1200,
|
||||||
|
"u": "images/",
|
||||||
|
"p": "img_4.png",
|
||||||
|
"e": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "image_5",
|
||||||
|
"w": 1200,
|
||||||
|
"h": 1200,
|
||||||
|
"u": "images/",
|
||||||
|
"p": "img_5.png",
|
||||||
|
"e": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "image_6",
|
||||||
|
"w": 1200,
|
||||||
|
"h": 1200,
|
||||||
|
"u": "images/",
|
||||||
|
"p": "img_6.png",
|
||||||
|
"e": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "image_7",
|
||||||
|
"w": 1200,
|
||||||
|
"h": 1200,
|
||||||
|
"u": "images/",
|
||||||
|
"p": "img_7.png",
|
||||||
|
"e": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "image_8",
|
||||||
|
"w": 1200,
|
||||||
|
"h": 1200,
|
||||||
|
"u": "images/",
|
||||||
|
"p": "img_8.png",
|
||||||
|
"e": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "image_9",
|
||||||
|
"w": 1200,
|
||||||
|
"h": 1200,
|
||||||
|
"u": "images/",
|
||||||
|
"p": "img_9.png",
|
||||||
|
"e": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"layers": [
|
||||||
|
{
|
||||||
|
"ddd": 0,
|
||||||
|
"ind": 2,
|
||||||
|
"ty": 2,
|
||||||
|
"nm": "F ARM Up",
|
||||||
|
"parent": 8,
|
||||||
|
"refId": "image_0",
|
||||||
|
"sr": 1,
|
||||||
|
"ks": {
|
||||||
|
"o": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 100,
|
||||||
|
"ix": 11
|
||||||
|
},
|
||||||
|
"r": {
|
||||||
|
"a": 1,
|
||||||
|
"k": [
|
||||||
|
{
|
||||||
|
"i": {
|
||||||
|
"x": [
|
||||||
|
0.333
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"o": {
|
||||||
|
"x": [
|
||||||
|
0.667
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"t": 0,
|
||||||
|
"s": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"i": {
|
||||||
|
"x": [
|
||||||
|
0.333
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"o": {
|
||||||
|
"x": [
|
||||||
|
0.667
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"t": 25,
|
||||||
|
"s": [
|
||||||
|
67
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"t": 50,
|
||||||
|
"s": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ix": 10
|
||||||
|
},
|
||||||
|
"p": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
623.019,
|
||||||
|
296.734,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 2
|
||||||
|
},
|
||||||
|
"a": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
623.019,
|
||||||
|
296.734,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 1
|
||||||
|
},
|
||||||
|
"s": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
100,
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"ix": 6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ao": 0,
|
||||||
|
"ip": 0,
|
||||||
|
"op": 250,
|
||||||
|
"st": 0,
|
||||||
|
"bm": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ddd": 0,
|
||||||
|
"ind": 3,
|
||||||
|
"ty": 2,
|
||||||
|
"nm": "F ARM Low",
|
||||||
|
"parent": 2,
|
||||||
|
"refId": "image_1",
|
||||||
|
"sr": 1,
|
||||||
|
"ks": {
|
||||||
|
"o": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 100,
|
||||||
|
"ix": 11
|
||||||
|
},
|
||||||
|
"r": {
|
||||||
|
"a": 1,
|
||||||
|
"k": [
|
||||||
|
{
|
||||||
|
"i": {
|
||||||
|
"x": [
|
||||||
|
0.333
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"o": {
|
||||||
|
"x": [
|
||||||
|
0.667
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"t": 0,
|
||||||
|
"s": [
|
||||||
|
43
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"i": {
|
||||||
|
"x": [
|
||||||
|
0.333
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"o": {
|
||||||
|
"x": [
|
||||||
|
0.667
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"t": 25,
|
||||||
|
"s": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"t": 50,
|
||||||
|
"s": [
|
||||||
|
43
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ix": 10
|
||||||
|
},
|
||||||
|
"p": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
623.019,
|
||||||
|
439.113,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 2
|
||||||
|
},
|
||||||
|
"a": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
623.019,
|
||||||
|
439.113,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 1
|
||||||
|
},
|
||||||
|
"s": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
100,
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"ix": 6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ao": 0,
|
||||||
|
"ip": 0,
|
||||||
|
"op": 250,
|
||||||
|
"st": 0,
|
||||||
|
"bm": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ddd": 0,
|
||||||
|
"ind": 4,
|
||||||
|
"ty": 2,
|
||||||
|
"nm": "F Hand",
|
||||||
|
"parent": 3,
|
||||||
|
"refId": "image_2",
|
||||||
|
"sr": 1,
|
||||||
|
"ks": {
|
||||||
|
"o": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 100,
|
||||||
|
"ix": 11
|
||||||
|
},
|
||||||
|
"r": {
|
||||||
|
"a": 1,
|
||||||
|
"k": [
|
||||||
|
{
|
||||||
|
"i": {
|
||||||
|
"x": [
|
||||||
|
0.333
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"o": {
|
||||||
|
"x": [
|
||||||
|
0.667
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"t": 0,
|
||||||
|
"s": [
|
||||||
|
41
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"i": {
|
||||||
|
"x": [
|
||||||
|
0.333
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"o": {
|
||||||
|
"x": [
|
||||||
|
0.667
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"t": 25,
|
||||||
|
"s": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"t": 50,
|
||||||
|
"s": [
|
||||||
|
41
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ix": 10
|
||||||
|
},
|
||||||
|
"p": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
623.019,
|
||||||
|
584.501,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 2
|
||||||
|
},
|
||||||
|
"a": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
623.019,
|
||||||
|
584.501,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 1
|
||||||
|
},
|
||||||
|
"s": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
100,
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"ix": 6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ao": 0,
|
||||||
|
"ip": 0,
|
||||||
|
"op": 250,
|
||||||
|
"st": 0,
|
||||||
|
"bm": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ddd": 0,
|
||||||
|
"ind": 5,
|
||||||
|
"ty": 2,
|
||||||
|
"nm": "F LEG Up",
|
||||||
|
"refId": "image_3",
|
||||||
|
"sr": 1,
|
||||||
|
"ks": {
|
||||||
|
"o": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 100,
|
||||||
|
"ix": 11
|
||||||
|
},
|
||||||
|
"r": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 90,
|
||||||
|
"ix": 10
|
||||||
|
},
|
||||||
|
"p": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
604.854,
|
||||||
|
589.662,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 2
|
||||||
|
},
|
||||||
|
"a": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
604.854,
|
||||||
|
589.662,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 1
|
||||||
|
},
|
||||||
|
"s": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
100,
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"ix": 6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ao": 0,
|
||||||
|
"ip": 0,
|
||||||
|
"op": 250,
|
||||||
|
"st": 0,
|
||||||
|
"bm": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ddd": 0,
|
||||||
|
"ind": 6,
|
||||||
|
"ty": 2,
|
||||||
|
"nm": "F LEG Low",
|
||||||
|
"parent": 5,
|
||||||
|
"refId": "image_4",
|
||||||
|
"sr": 1,
|
||||||
|
"ks": {
|
||||||
|
"o": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 100,
|
||||||
|
"ix": 11
|
||||||
|
},
|
||||||
|
"r": {
|
||||||
|
"a": 0,
|
||||||
|
"k": -90,
|
||||||
|
"ix": 10
|
||||||
|
},
|
||||||
|
"p": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
608.016,
|
||||||
|
829.202,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 2
|
||||||
|
},
|
||||||
|
"a": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
608.016,
|
||||||
|
829.202,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 1
|
||||||
|
},
|
||||||
|
"s": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
100,
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"ix": 6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ao": 0,
|
||||||
|
"ip": 0,
|
||||||
|
"op": 250,
|
||||||
|
"st": 0,
|
||||||
|
"bm": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ddd": 0,
|
||||||
|
"ind": 7,
|
||||||
|
"ty": 2,
|
||||||
|
"nm": "F Foot",
|
||||||
|
"parent": 6,
|
||||||
|
"refId": "image_5",
|
||||||
|
"sr": 1,
|
||||||
|
"ks": {
|
||||||
|
"o": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 100,
|
||||||
|
"ix": 11
|
||||||
|
},
|
||||||
|
"r": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 0,
|
||||||
|
"ix": 10
|
||||||
|
},
|
||||||
|
"p": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
608.863,
|
||||||
|
1058.742,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 2
|
||||||
|
},
|
||||||
|
"a": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
608.863,
|
||||||
|
1058.742,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 1
|
||||||
|
},
|
||||||
|
"s": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
100,
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"ix": 6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ao": 0,
|
||||||
|
"ip": 0,
|
||||||
|
"op": 250,
|
||||||
|
"st": 0,
|
||||||
|
"bm": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ddd": 0,
|
||||||
|
"ind": 8,
|
||||||
|
"ty": 2,
|
||||||
|
"nm": "Body",
|
||||||
|
"parent": 11,
|
||||||
|
"refId": "image_6",
|
||||||
|
"sr": 1,
|
||||||
|
"ks": {
|
||||||
|
"o": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 100,
|
||||||
|
"ix": 11
|
||||||
|
},
|
||||||
|
"r": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 0,
|
||||||
|
"ix": 10
|
||||||
|
},
|
||||||
|
"p": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
605.434,
|
||||||
|
468.468,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 2
|
||||||
|
},
|
||||||
|
"a": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
605.434,
|
||||||
|
468.468,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 1
|
||||||
|
},
|
||||||
|
"s": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
100,
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"ix": 6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ao": 0,
|
||||||
|
"ip": 0,
|
||||||
|
"op": 250,
|
||||||
|
"st": 0,
|
||||||
|
"bm": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ddd": 0,
|
||||||
|
"ind": 9,
|
||||||
|
"ty": 2,
|
||||||
|
"nm": "Head",
|
||||||
|
"parent": 8,
|
||||||
|
"refId": "image_7",
|
||||||
|
"sr": 1,
|
||||||
|
"ks": {
|
||||||
|
"o": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 100,
|
||||||
|
"ix": 11
|
||||||
|
},
|
||||||
|
"r": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 0,
|
||||||
|
"ix": 10
|
||||||
|
},
|
||||||
|
"p": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
623.019,
|
||||||
|
263.511,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 2
|
||||||
|
},
|
||||||
|
"a": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
623.019,
|
||||||
|
263.511,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 1
|
||||||
|
},
|
||||||
|
"s": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
100,
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"ix": 6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ao": 0,
|
||||||
|
"ip": 0,
|
||||||
|
"op": 250,
|
||||||
|
"st": 0,
|
||||||
|
"bm": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ddd": 0,
|
||||||
|
"ind": 10,
|
||||||
|
"ty": 2,
|
||||||
|
"nm": "Hair",
|
||||||
|
"parent": 9,
|
||||||
|
"refId": "image_8",
|
||||||
|
"sr": 1,
|
||||||
|
"ks": {
|
||||||
|
"o": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 100,
|
||||||
|
"ix": 11
|
||||||
|
},
|
||||||
|
"r": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 0,
|
||||||
|
"ix": 10
|
||||||
|
},
|
||||||
|
"p": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
600,
|
||||||
|
600,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 2
|
||||||
|
},
|
||||||
|
"a": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
600,
|
||||||
|
600,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 1
|
||||||
|
},
|
||||||
|
"s": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
100,
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"ix": 6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ao": 0,
|
||||||
|
"ip": 0,
|
||||||
|
"op": 250,
|
||||||
|
"st": 0,
|
||||||
|
"bm": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ddd": 0,
|
||||||
|
"ind": 11,
|
||||||
|
"ty": 2,
|
||||||
|
"nm": "Waist",
|
||||||
|
"refId": "image_9",
|
||||||
|
"sr": 1,
|
||||||
|
"ks": {
|
||||||
|
"o": {
|
||||||
|
"a": 0,
|
||||||
|
"k": 100,
|
||||||
|
"ix": 11
|
||||||
|
},
|
||||||
|
"r": {
|
||||||
|
"a": 1,
|
||||||
|
"k": [
|
||||||
|
{
|
||||||
|
"i": {
|
||||||
|
"x": [
|
||||||
|
0.333
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"o": {
|
||||||
|
"x": [
|
||||||
|
0.667
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"t": 0,
|
||||||
|
"s": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"i": {
|
||||||
|
"x": [
|
||||||
|
0.333
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"o": {
|
||||||
|
"x": [
|
||||||
|
0.667
|
||||||
|
],
|
||||||
|
"y": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"t": 25,
|
||||||
|
"s": [
|
||||||
|
-70
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"t": 50,
|
||||||
|
"s": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ix": 10
|
||||||
|
},
|
||||||
|
"p": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
604.854,
|
||||||
|
589.662,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 2
|
||||||
|
},
|
||||||
|
"a": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
604.854,
|
||||||
|
589.662,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"ix": 1
|
||||||
|
},
|
||||||
|
"s": {
|
||||||
|
"a": 0,
|
||||||
|
"k": [
|
||||||
|
100,
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"ix": 6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ao": 0,
|
||||||
|
"ip": 0,
|
||||||
|
"op": 250,
|
||||||
|
"st": 0,
|
||||||
|
"bm": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"markers": [
|
||||||
|
{
|
||||||
|
"tm": 25,
|
||||||
|
"cm": "9",
|
||||||
|
"dr": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
BIN
example/assets/example_with_images/images/img_0.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
10
example/assets/example_with_images/images/img_0.svg
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 24.1.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 1200 1200" style="enable-background:new 0 0 1200 1200;" xml:space="preserve">
|
||||||
|
<style type="text/css">
|
||||||
|
.st0{fill:#FFA913;}
|
||||||
|
</style>
|
||||||
|
<path class="st0" d="M641.59,439.11l7.69-142.38c0-14.5-11.76-26.26-26.26-26.26c-14.5,0-26.26,11.76-26.26,26.26l7.69,142.38
|
||||||
|
c0,10.26,8.31,18.57,18.57,18.57C633.28,457.68,641.59,449.37,641.59,439.11z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 616 B |
BIN
example/assets/example_with_images/images/img_1.png
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
example/assets/example_with_images/images/img_2.png
Normal file
After Width: | Height: | Size: 6.4 KiB |
BIN
example/assets/example_with_images/images/img_3.png
Normal file
After Width: | Height: | Size: 9.3 KiB |
BIN
example/assets/example_with_images/images/img_4.png
Normal file
After Width: | Height: | Size: 8.4 KiB |
BIN
example/assets/example_with_images/images/img_5.png
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
example/assets/example_with_images/images/img_6.png
Normal file
After Width: | Height: | Size: 8.5 KiB |
BIN
example/assets/example_with_images/images/img_7.png
Normal file
After Width: | Height: | Size: 8.8 KiB |
BIN
example/assets/example_with_images/images/img_8.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
example/assets/example_with_images/images/img_9.png
Normal file
After Width: | Height: | Size: 8.7 KiB |
118232
example/assets/playing.json
Normal file
1
example/assets/sticker.json
Normal file
3133
example/assets/tent.json
Normal file
1
example/assets/weather/fog.json
Normal file
2534
example/assets/weather/hurricane.json
Normal file
1
example/assets/weather/thunder-storm.json
Normal file
1964
example/assets/weather/tornado.json
Normal file
1
example/assets/weather/windy.json
Normal file
@ -1 +1,2 @@
|
|||||||
|
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
|
||||||
#include "Generated.xcconfig"
|
#include "Generated.xcconfig"
|
||||||
|
@ -1 +1,2 @@
|
|||||||
|
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
|
||||||
#include "Generated.xcconfig"
|
#include "Generated.xcconfig"
|
||||||
|
87
example/ios/Podfile
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
# Uncomment this line to define a global platform for your project
|
||||||
|
# platform :ios, '9.0'
|
||||||
|
|
||||||
|
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||||
|
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||||
|
|
||||||
|
project 'Runner', {
|
||||||
|
'Debug' => :debug,
|
||||||
|
'Profile' => :release,
|
||||||
|
'Release' => :release,
|
||||||
|
}
|
||||||
|
|
||||||
|
def parse_KV_file(file, separator='=')
|
||||||
|
file_abs_path = File.expand_path(file)
|
||||||
|
if !File.exists? file_abs_path
|
||||||
|
return [];
|
||||||
|
end
|
||||||
|
generated_key_values = {}
|
||||||
|
skip_line_start_symbols = ["#", "/"]
|
||||||
|
File.foreach(file_abs_path) do |line|
|
||||||
|
next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
|
||||||
|
plugin = line.split(pattern=separator)
|
||||||
|
if plugin.length == 2
|
||||||
|
podname = plugin[0].strip()
|
||||||
|
path = plugin[1].strip()
|
||||||
|
podpath = File.expand_path("#{path}", file_abs_path)
|
||||||
|
generated_key_values[podname] = podpath
|
||||||
|
else
|
||||||
|
puts "Invalid plugin specification: #{line}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
generated_key_values
|
||||||
|
end
|
||||||
|
|
||||||
|
target 'Runner' do
|
||||||
|
use_frameworks!
|
||||||
|
use_modular_headers!
|
||||||
|
|
||||||
|
# Flutter Pod
|
||||||
|
|
||||||
|
copied_flutter_dir = File.join(__dir__, 'Flutter')
|
||||||
|
copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework')
|
||||||
|
copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec')
|
||||||
|
unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path)
|
||||||
|
# Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet.
|
||||||
|
# That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration.
|
||||||
|
# CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist.
|
||||||
|
|
||||||
|
generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig')
|
||||||
|
unless File.exist?(generated_xcode_build_settings_path)
|
||||||
|
raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first"
|
||||||
|
end
|
||||||
|
generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path)
|
||||||
|
cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR'];
|
||||||
|
|
||||||
|
unless File.exist?(copied_framework_path)
|
||||||
|
FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir)
|
||||||
|
end
|
||||||
|
unless File.exist?(copied_podspec_path)
|
||||||
|
FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Keep pod path relative so it can be checked into Podfile.lock.
|
||||||
|
pod 'Flutter', :path => 'Flutter'
|
||||||
|
|
||||||
|
# Plugin Pods
|
||||||
|
|
||||||
|
# Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
|
||||||
|
# referring to absolute paths on developers' machines.
|
||||||
|
system('rm -rf .symlinks')
|
||||||
|
system('mkdir -p .symlinks/plugins')
|
||||||
|
plugin_pods = parse_KV_file('../.flutter-plugins')
|
||||||
|
plugin_pods.each do |name, path|
|
||||||
|
symlink = File.join('.symlinks', 'plugins', name)
|
||||||
|
File.symlink(path, symlink)
|
||||||
|
pod name, :path => File.join(symlink, 'ios')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
post_install do |installer|
|
||||||
|
installer.pods_project.targets.each do |target|
|
||||||
|
target.build_configurations.each do |config|
|
||||||
|
config.build_settings['ENABLE_BITCODE'] = 'NO'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
28
example/ios/Podfile.lock
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
PODS:
|
||||||
|
- Flutter (1.0.0)
|
||||||
|
- path_provider (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- path_provider_macos (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
|
||||||
|
DEPENDENCIES:
|
||||||
|
- Flutter (from `Flutter`)
|
||||||
|
- path_provider (from `.symlinks/plugins/path_provider/ios`)
|
||||||
|
- path_provider_macos (from `.symlinks/plugins/path_provider_macos/ios`)
|
||||||
|
|
||||||
|
EXTERNAL SOURCES:
|
||||||
|
Flutter:
|
||||||
|
:path: Flutter
|
||||||
|
path_provider:
|
||||||
|
:path: ".symlinks/plugins/path_provider/ios"
|
||||||
|
path_provider_macos:
|
||||||
|
:path: ".symlinks/plugins/path_provider_macos/ios"
|
||||||
|
|
||||||
|
SPEC CHECKSUMS:
|
||||||
|
Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
|
||||||
|
path_provider: fb74bd0465e96b594bb3b5088ee4a4e7bb1f2a9d
|
||||||
|
path_provider_macos: f760a3c5b04357c380e2fddb6f9db6f3015897e0
|
||||||
|
|
||||||
|
PODFILE CHECKSUM: c34e2287a9ccaa606aeceab922830efb9a6ff69a
|
||||||
|
|
||||||
|
COCOAPODS: 1.9.1
|
@ -9,11 +9,8 @@
|
|||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||||
3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; };
|
4E7FB8175FD7E724C16AD66F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3978ECE970E899926A99EA4E /* Pods_Runner.framework */; };
|
||||||
3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
|
||||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||||
9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; };
|
|
||||||
9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
|
||||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||||
@ -26,8 +23,6 @@
|
|||||||
dstPath = "";
|
dstPath = "";
|
||||||
dstSubfolderSpec = 10;
|
dstSubfolderSpec = 10;
|
||||||
files = (
|
files = (
|
||||||
3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */,
|
|
||||||
9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */,
|
|
||||||
);
|
);
|
||||||
name = "Embed Frameworks";
|
name = "Embed Frameworks";
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
@ -37,14 +32,16 @@
|
|||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
||||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
||||||
|
1B497423C23FD55DD0B8C378 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
31ACBCF01D379565237D9814 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
3978ECE970E899926A99EA4E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||||
3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = "<group>"; };
|
5A699D4B67473B61D811D350 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
||||||
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
||||||
9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = "<group>"; };
|
|
||||||
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
@ -57,20 +54,36 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */,
|
4E7FB8175FD7E724C16AD66F /* Pods_Runner.framework in Frameworks */,
|
||||||
3B80C3941E831B6300D905FE /* App.framework in Frameworks */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
/* End PBXFrameworksBuildPhase section */
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
|
14B9AAB3E57437F7B9E442AA /* Pods */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
1B497423C23FD55DD0B8C378 /* Pods-Runner.debug.xcconfig */,
|
||||||
|
31ACBCF01D379565237D9814 /* Pods-Runner.release.xcconfig */,
|
||||||
|
5A699D4B67473B61D811D350 /* Pods-Runner.profile.xcconfig */,
|
||||||
|
);
|
||||||
|
name = Pods;
|
||||||
|
path = Pods;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
3E6BFE152BA6E928D3C57CB7 /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
3978ECE970E899926A99EA4E /* Pods_Runner.framework */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
9740EEB11CF90186004384FC /* Flutter */ = {
|
9740EEB11CF90186004384FC /* Flutter */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
3B80C3931E831B6300D905FE /* App.framework */,
|
|
||||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
|
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
|
||||||
9740EEBA1CF902C7004384FC /* Flutter.framework */,
|
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
||||||
9740EEB31CF90195004384FC /* Generated.xcconfig */,
|
9740EEB31CF90195004384FC /* Generated.xcconfig */,
|
||||||
@ -84,6 +97,8 @@
|
|||||||
9740EEB11CF90186004384FC /* Flutter */,
|
9740EEB11CF90186004384FC /* Flutter */,
|
||||||
97C146F01CF9000F007C117D /* Runner */,
|
97C146F01CF9000F007C117D /* Runner */,
|
||||||
97C146EF1CF9000F007C117D /* Products */,
|
97C146EF1CF9000F007C117D /* Products */,
|
||||||
|
14B9AAB3E57437F7B9E442AA /* Pods */,
|
||||||
|
3E6BFE152BA6E928D3C57CB7 /* Frameworks */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
@ -125,12 +140,14 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
43690862AB1C8D2C663E62A1 /* [CP] Check Pods Manifest.lock */,
|
||||||
9740EEB61CF901F6004384FC /* Run Script */,
|
9740EEB61CF901F6004384FC /* Run Script */,
|
||||||
97C146EA1CF9000F007C117D /* Sources */,
|
97C146EA1CF9000F007C117D /* Sources */,
|
||||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||||
97C146EC1CF9000F007C117D /* Resources */,
|
97C146EC1CF9000F007C117D /* Resources */,
|
||||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||||
|
DA3E0E6397CD983DB6281FAB /* [CP] Embed Pods Frameworks */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
@ -202,7 +219,29 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin";
|
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
||||||
|
};
|
||||||
|
43690862AB1C8D2C663E62A1 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
@ -218,6 +257,26 @@
|
|||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
||||||
};
|
};
|
||||||
|
DA3E0E6397CD983DB6281FAB /* [CP] Embed Pods Frameworks */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
|
||||||
|
"${PODS_ROOT}/../Flutter/Flutter.framework",
|
||||||
|
"${BUILT_PRODUCTS_DIR}/path_provider/path_provider.framework",
|
||||||
|
);
|
||||||
|
name = "[CP] Embed Pods Frameworks";
|
||||||
|
outputPaths = (
|
||||||
|
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework",
|
||||||
|
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider.framework",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
@ -4,4 +4,7 @@
|
|||||||
<FileRef
|
<FileRef
|
||||||
location = "group:Runner.xcodeproj">
|
location = "group:Runner.xcodeproj">
|
||||||
</FileRef>
|
</FileRef>
|
||||||
|
<FileRef
|
||||||
|
location = "group:Pods/Pods.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
</Workspace>
|
</Workspace>
|
||||||
|
47
example/lib/examples/alert_dialog.dart
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/scheduler.dart';
|
||||||
|
import 'package:lottie/lottie.dart';
|
||||||
|
|
||||||
|
void main() => runApp(App());
|
||||||
|
|
||||||
|
class App extends StatelessWidget {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return MaterialApp(
|
||||||
|
home: Scaffold(body: _Page()),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _Page extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
__PageState createState() => __PageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class __PageState extends State<_Page> {
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
|
||||||
|
SchedulerBinding.instance.addPostFrameCallback((_) => _showLoader());
|
||||||
|
}
|
||||||
|
|
||||||
|
void _showLoader() {
|
||||||
|
showDialog<void>(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => Center(
|
||||||
|
child: Lottie.network(
|
||||||
|
'https://assets10.lottiefiles.com/datafiles/QeC7XD39x4C1CIj/data.json',
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
width: 200,
|
||||||
|
height: 200,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Center();
|
||||||
|
}
|
||||||
|
}
|
@ -5,23 +5,15 @@ void main() async {
|
|||||||
runApp(App());
|
runApp(App());
|
||||||
}
|
}
|
||||||
|
|
||||||
class App extends StatefulWidget {
|
class App extends StatelessWidget {
|
||||||
const App({Key key}) : super(key: key);
|
const App({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
|
||||||
_AppState createState() => _AppState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _AppState extends State<App> with TickerProviderStateMixin {
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return MaterialApp(
|
return MaterialApp(
|
||||||
color: Colors.lightBlue,
|
color: Colors.lightBlue,
|
||||||
home: Scaffold(
|
home: Scaffold(
|
||||||
backgroundColor: Colors.lightBlue,
|
backgroundColor: Colors.lightBlue,
|
||||||
appBar: AppBar(
|
|
||||||
title: Text(''),
|
|
||||||
),
|
|
||||||
body: Center(
|
body: Center(
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
width: 300,
|
width: 300,
|
||||||
|
@ -30,8 +30,8 @@ class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
|
|||||||
home: Scaffold(
|
home: Scaffold(
|
||||||
body: ListView(
|
body: ListView(
|
||||||
children: [
|
children: [
|
||||||
Lottie.network(
|
Lottie.asset(
|
||||||
'https://raw.githubusercontent.com/xvrh/lottie-flutter/master/example/assets/Mobilo/C.json',
|
'assets/LottieLogo1.json',
|
||||||
controller: _controller,
|
controller: _controller,
|
||||||
onLoaded: (composition) {
|
onLoaded: (composition) {
|
||||||
// Configure the AnimationController with the duration of the
|
// Configure the AnimationController with the duration of the
|
||||||
|
109
example/lib/examples/animation_full_control.dart
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:lottie/lottie.dart';
|
||||||
|
|
||||||
|
/// This example show how to play the Lottie animation in various way:
|
||||||
|
/// - Start and stop the animation on event callback
|
||||||
|
/// - Play the animation forward and backward
|
||||||
|
/// - Loop between two specific frames
|
||||||
|
///
|
||||||
|
/// This works by creating an AnimationController instance and passing it
|
||||||
|
/// to the Lottie widget.
|
||||||
|
/// The AnimationController class has a rich API to run the animation in various ways.
|
||||||
|
void main() => runApp(MyApp());
|
||||||
|
|
||||||
|
class MyApp extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_MyAppState createState() => _MyAppState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
|
||||||
|
AnimationController _controller;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
|
||||||
|
_controller = AnimationController(vsync: this)
|
||||||
|
..value = 0.5
|
||||||
|
..addListener(() {
|
||||||
|
setState(() {
|
||||||
|
// Rebuild the widget at each frame to update the "progress" label.
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_controller.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return MaterialApp(
|
||||||
|
home: Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: Text('Animation control'),
|
||||||
|
),
|
||||||
|
body: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
const SizedBox(height: 20),
|
||||||
|
Lottie.asset(
|
||||||
|
'assets/LottieLogo1.json',
|
||||||
|
controller: _controller,
|
||||||
|
height: 300,
|
||||||
|
onLoaded: (composition) {
|
||||||
|
setState(() {
|
||||||
|
_controller.duration = composition.duration;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Text('${_controller.value.toStringAsFixed(2)}'),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
// Play backward
|
||||||
|
IconButton(
|
||||||
|
icon: Icon(Icons.arrow_left),
|
||||||
|
onPressed: () {
|
||||||
|
_controller.reverse();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
// Pause
|
||||||
|
IconButton(
|
||||||
|
icon: Icon(Icons.pause),
|
||||||
|
onPressed: () {
|
||||||
|
_controller.stop();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
// Play forward
|
||||||
|
IconButton(
|
||||||
|
icon: Icon(Icons.arrow_right),
|
||||||
|
onPressed: () {
|
||||||
|
_controller.forward();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(height: 30),
|
||||||
|
RaisedButton(
|
||||||
|
child: Text('Loop between frames'),
|
||||||
|
onPressed: () {
|
||||||
|
// Loop between 2 specifics frames
|
||||||
|
|
||||||
|
var start = 0.1;
|
||||||
|
var stop = 0.5;
|
||||||
|
_controller.repeat(
|
||||||
|
min: start,
|
||||||
|
max: stop,
|
||||||
|
reverse: true,
|
||||||
|
period: _controller.duration * (stop - start),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -69,14 +69,13 @@ class CustomDrawer extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _Painter extends CustomPainter {
|
class _Painter extends CustomPainter {
|
||||||
final LottieComposition composition;
|
final LottieDrawable drawable;
|
||||||
|
|
||||||
_Painter(this.composition);
|
_Painter(LottieComposition composition)
|
||||||
|
: drawable = LottieDrawable(composition);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void paint(Canvas canvas, Size size) {
|
void paint(Canvas canvas, Size size) {
|
||||||
var drawable = LottieDrawable(composition);
|
|
||||||
|
|
||||||
var frameCount = 40;
|
var frameCount = 40;
|
||||||
var columns = 10;
|
var columns = 10;
|
||||||
for (var i = 0; i < frameCount; i++) {
|
for (var i = 0; i < frameCount; i++) {
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:lottie/lottie.dart';
|
|
||||||
|
|
||||||
void main() => runApp(MyApp());
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
home: Scaffold(
|
|
||||||
body: ListView(
|
|
||||||
children: [
|
|
||||||
// Load a Lottie file from your assets
|
|
||||||
Lottie.asset('assets/LottieLogo1.json'),
|
|
||||||
|
|
||||||
// Load a Lottie file from a remote url
|
|
||||||
Lottie.network(
|
|
||||||
'https://raw.githubusercontent.com/xvrh/lottie-flutter/master/example/assets/Mobilo/A.json'),
|
|
||||||
|
|
||||||
// Load an animation and its images from a zip file
|
|
||||||
Lottie.asset('assets/lottiefiles/angel.zip'),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
122
example/lib/examples/markers.dart
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:lottie/lottie.dart';
|
||||||
|
|
||||||
|
/// This example shows how to play the animation between two markers.
|
||||||
|
/// It is based on this article for lottie-ios:
|
||||||
|
/// https://medium.com/swlh/controlling-lottie-animation-with-markers-5e9035d94623
|
||||||
|
void main() async {
|
||||||
|
runApp(App());
|
||||||
|
}
|
||||||
|
|
||||||
|
class App extends StatefulWidget {
|
||||||
|
const App({Key key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_AppState createState() => _AppState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AppState extends State<App> with TickerProviderStateMixin {
|
||||||
|
Future<LottieComposition> _composition;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_composition = AssetLottie('assets/TwitterHeartButton.json').load();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return MaterialApp(
|
||||||
|
theme: ThemeData.dark(),
|
||||||
|
home: Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: Text('Markers'),
|
||||||
|
),
|
||||||
|
body: FutureBuilder<LottieComposition>(
|
||||||
|
future: _composition,
|
||||||
|
builder: (context, snapshot) {
|
||||||
|
if (snapshot.hasError) return ErrorWidget(snapshot.error);
|
||||||
|
if (!snapshot.hasData) return CircularProgressIndicator();
|
||||||
|
return _LottieDetails(snapshot.data);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _LottieDetails extends StatefulWidget {
|
||||||
|
final LottieComposition composition;
|
||||||
|
|
||||||
|
const _LottieDetails(this.composition, {Key key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_LottieDetailsState createState() => _LottieDetailsState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _LottieDetailsState extends State<_LottieDetails>
|
||||||
|
with TickerProviderStateMixin {
|
||||||
|
AnimationController _controller;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_controller = AnimationController(vsync: this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_controller.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return ListView(
|
||||||
|
children: [
|
||||||
|
Lottie(
|
||||||
|
composition: widget.composition,
|
||||||
|
controller: _controller,
|
||||||
|
height: 150,
|
||||||
|
),
|
||||||
|
ListTile(
|
||||||
|
title: Text('Composition start frame'),
|
||||||
|
trailing: Text(widget.composition.startFrame.toStringAsFixed(1)),
|
||||||
|
),
|
||||||
|
ListTile(
|
||||||
|
title: Text('Composition duration'),
|
||||||
|
trailing: Text(widget.composition.durationFrames.toStringAsFixed(1)),
|
||||||
|
),
|
||||||
|
RaisedButton(
|
||||||
|
child: Text('touchDownEnd - touchUpCancel'),
|
||||||
|
onPressed: () => _playBetween('touchDownEnd', 'touchUpCancel'),
|
||||||
|
),
|
||||||
|
RaisedButton(
|
||||||
|
child: Text('touchDownStart - touchDownEnd'),
|
||||||
|
onPressed: () => _playBetween('touchDownStart', 'touchDownEnd'),
|
||||||
|
),
|
||||||
|
RaisedButton(
|
||||||
|
child: Text('touchDownEnd - touchUpEnd'),
|
||||||
|
onPressed: () => _playBetween('touchDownEnd', 'touchUpEnd'),
|
||||||
|
),
|
||||||
|
for (var marker in widget.composition.markers)
|
||||||
|
ListTile(
|
||||||
|
title: Text(marker.name),
|
||||||
|
subtitle: Text(
|
||||||
|
'${marker.startFrame.toStringAsFixed(1)} ${marker.durationFrames.toStringAsFixed(1)}'),
|
||||||
|
trailing: Text(
|
||||||
|
'[${marker.start.toStringAsFixed(2)}-${marker.end.toStringAsFixed(2)}]'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _playBetween(String marker1, String marker2) {
|
||||||
|
var start = widget.composition.getMarker(marker1).start;
|
||||||
|
var end = widget.composition.getMarker(marker2).start;
|
||||||
|
|
||||||
|
_controller.value = start;
|
||||||
|
_controller.animateTo(end,
|
||||||
|
duration: widget.composition.duration * (end - start).abs());
|
||||||
|
}
|
||||||
|
}
|
100
example/lib/examples/save_frames.dart
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
import 'dart:ui';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:lottie/lottie.dart';
|
||||||
|
import 'package:path/path.dart' as p;
|
||||||
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
|
||||||
|
/// This example shows how to save the frame of an animation to files on disk.
|
||||||
|
void main() => runApp(MyApp());
|
||||||
|
|
||||||
|
class MyApp extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_MyAppState createState() => _MyAppState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _MyAppState extends State<MyApp> {
|
||||||
|
List<File> _frames;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return MaterialApp(
|
||||||
|
home: Scaffold(
|
||||||
|
backgroundColor: Colors.grey,
|
||||||
|
body: SafeArea(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
|
children: [
|
||||||
|
RaisedButton(
|
||||||
|
child: Text('Export all frames'),
|
||||||
|
onPressed: _export,
|
||||||
|
),
|
||||||
|
if (_frames != null)
|
||||||
|
Expanded(
|
||||||
|
child: GridView.count(
|
||||||
|
crossAxisCount: 10,
|
||||||
|
children: [..._frames.map((f) => Image.file(f))],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _export() async {
|
||||||
|
var composition =
|
||||||
|
await AssetLottie('assets/lottiefiles/airbnb.json').load();
|
||||||
|
|
||||||
|
var frames = await exportFrames(
|
||||||
|
composition, await _createTempDirectory('export-lottie'),
|
||||||
|
progresses: [for (var i = 0.0; i <= 1; i += 0.1) i],
|
||||||
|
size: Size(50, 50));
|
||||||
|
|
||||||
|
setState(() {
|
||||||
|
_frames = frames;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<File>> exportFrames(LottieComposition composition, String directory,
|
||||||
|
{@required Size size, @required List<double> progresses}) async {
|
||||||
|
var drawable = LottieDrawable(composition);
|
||||||
|
|
||||||
|
var frames = <File>[];
|
||||||
|
for (var progress in progresses) {
|
||||||
|
drawable.setProgress(progress);
|
||||||
|
|
||||||
|
var bytes = await _toByteData(drawable, size);
|
||||||
|
var fileName = (progress * 100).round().toString().padLeft(3, '0');
|
||||||
|
|
||||||
|
var file = File(p.join(directory, '$fileName.png'));
|
||||||
|
await file.writeAsBytes(bytes.buffer.asUint8List());
|
||||||
|
|
||||||
|
frames.add(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
return frames;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<ByteData> _toByteData(LottieDrawable drawable, Size size) async {
|
||||||
|
var pictureRecorder = PictureRecorder();
|
||||||
|
var canvas = Canvas(pictureRecorder);
|
||||||
|
|
||||||
|
drawable.draw(canvas, Offset.zero & size);
|
||||||
|
|
||||||
|
var picture = pictureRecorder.endRecording();
|
||||||
|
var image = await picture.toImage(size.width.toInt(), size.height.toInt());
|
||||||
|
return await image.toByteData(format: ImageByteFormat.png);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String> _createTempDirectory(String folderName) async {
|
||||||
|
final tempDirectory = await getTemporaryDirectory();
|
||||||
|
var dir = Directory(p.join(tempDirectory.path, folderName));
|
||||||
|
if (!dir.existsSync()) {
|
||||||
|
await dir.create(recursive: true);
|
||||||
|
}
|
||||||
|
return dir.path;
|
||||||
|
}
|
@ -16,8 +16,6 @@ class MyApp extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String translate(String input) => '**$input**';
|
|
||||||
|
|
||||||
//--- example
|
//--- example
|
||||||
class _Animation extends StatelessWidget {
|
class _Animation extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
@ -25,22 +23,22 @@ class _Animation extends StatelessWidget {
|
|||||||
return Lottie.asset(
|
return Lottie.asset(
|
||||||
'assets/Tests/Shapes.json',
|
'assets/Tests/Shapes.json',
|
||||||
delegates: LottieDelegates(
|
delegates: LottieDelegates(
|
||||||
text: (initialText) => translate(initialText),
|
text: (initialText) => '**$initialText**',
|
||||||
values: [
|
values: [
|
||||||
ValueDelegate.color(
|
ValueDelegate.color(
|
||||||
const ['Shape Layer 1', 'Rectangle', 'Fill 1'],
|
const ['Shape Layer 1', 'Rectangle', 'Fill 1'],
|
||||||
value: Colors.red,
|
value: Colors.red,
|
||||||
),
|
),
|
||||||
ValueDelegate.opacity(
|
ValueDelegate.opacity(
|
||||||
const ['Shape Layer 1', 'Rectangle'],
|
const ['Shape Layer 1', 'Rectangle'],
|
||||||
callback: (frameInfo) =>
|
callback: (frameInfo) => (frameInfo.overallProgress * 100).round(),
|
||||||
(frameInfo.overallProgress * 100).round(),
|
),
|
||||||
),
|
ValueDelegate.position(
|
||||||
ValueDelegate.position(
|
const ['Shape Layer 1', 'Rectangle', '**'],
|
||||||
const ['Shape Layer 1', 'Rectangle'],
|
relative: Offset(100, 200),
|
||||||
relative: Offset(100, 200),
|
),
|
||||||
),
|
],
|
||||||
]),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,157 +1,24 @@
|
|||||||
import 'package:flutter/cupertino.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:logging/logging.dart';
|
|
||||||
import 'package:lottie/lottie.dart';
|
import 'package:lottie/lottie.dart';
|
||||||
import 'src/all_files.g.dart';
|
|
||||||
|
|
||||||
void main() {
|
void main() => runApp(MyApp());
|
||||||
Logger.root
|
|
||||||
..level = Level.ALL
|
|
||||||
..onRecord.listen(print);
|
|
||||||
Lottie.traceEnabled = true;
|
|
||||||
runApp(App());
|
|
||||||
}
|
|
||||||
|
|
||||||
class App extends StatelessWidget {
|
class MyApp extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return MaterialApp(
|
return MaterialApp(
|
||||||
//showPerformanceOverlay: true,
|
|
||||||
home: Scaffold(
|
home: Scaffold(
|
||||||
appBar: AppBar(
|
body: ListView(
|
||||||
title: Text('Lottie Flutter'),
|
|
||||||
),
|
|
||||||
body: GridView.builder(
|
|
||||||
itemCount: files.length,
|
|
||||||
gridDelegate:
|
|
||||||
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4),
|
|
||||||
itemBuilder: (context, index) {
|
|
||||||
var assetName = files[index];
|
|
||||||
return GestureDetector(
|
|
||||||
child: _Item(
|
|
||||||
child: Lottie.asset(
|
|
||||||
assetName,
|
|
||||||
frameBuilder: (context, child, composition) {
|
|
||||||
return AnimatedOpacity(
|
|
||||||
child: child,
|
|
||||||
opacity: composition == null ? 0 : 1,
|
|
||||||
duration: const Duration(seconds: 1),
|
|
||||||
curve: Curves.easeOut,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
onTap: () {
|
|
||||||
Navigator.of(context).push(MaterialPageRoute<void>(
|
|
||||||
builder: (context) => Detail(assetName)));
|
|
||||||
},
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class _Item extends StatelessWidget {
|
|
||||||
final Widget child;
|
|
||||||
|
|
||||||
const _Item({Key key, this.child}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.all(8.0),
|
|
||||||
child: Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.white,
|
|
||||||
borderRadius: BorderRadius.all(Radius.circular(10)),
|
|
||||||
boxShadow: [
|
|
||||||
BoxShadow(
|
|
||||||
color: Colors.black.withOpacity(0.1),
|
|
||||||
offset: Offset(2, 2),
|
|
||||||
blurRadius: 5)
|
|
||||||
]),
|
|
||||||
child: child,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Detail extends StatefulWidget {
|
|
||||||
final String assetName;
|
|
||||||
|
|
||||||
const Detail(this.assetName, {Key key}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
_DetailState createState() => _DetailState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _DetailState extends State<Detail> with TickerProviderStateMixin {
|
|
||||||
AnimationController _controller;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
|
|
||||||
_controller = AnimationController(vsync: this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
_controller.dispose();
|
|
||||||
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
appBar: AppBar(
|
|
||||||
title: Text('${widget.assetName}'),
|
|
||||||
),
|
|
||||||
body: SingleChildScrollView(
|
|
||||||
child: Column(
|
|
||||||
children: [
|
children: [
|
||||||
Center(
|
// Load a Lottie file from your assets
|
||||||
child: Lottie.asset(
|
Lottie.asset('assets/LottieLogo1.json'),
|
||||||
widget.assetName,
|
|
||||||
controller: _controller,
|
// Load a Lottie file from a remote url
|
||||||
onLoaded: (composition) {
|
Lottie.network(
|
||||||
_controller.duration = composition.duration;
|
'https://raw.githubusercontent.com/xvrh/lottie-flutter/master/example/assets/Mobilo/A.json'),
|
||||||
_controller.repeat();
|
|
||||||
},
|
// Load an animation and its images from a zip file
|
||||||
),
|
Lottie.asset('assets/lottiefiles/angel.zip'),
|
||||||
),
|
|
||||||
AnimatedBuilder(
|
|
||||||
animation: _controller,
|
|
||||||
builder: (context, _) => Row(
|
|
||||||
children: <Widget>[
|
|
||||||
Expanded(
|
|
||||||
child: Slider(
|
|
||||||
value: _controller.value,
|
|
||||||
onChanged: (newValue) {
|
|
||||||
_controller.value = newValue;
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
IconButton(
|
|
||||||
icon: Icon(_controller.isAnimating
|
|
||||||
? Icons.stop
|
|
||||||
: Icons.play_arrow),
|
|
||||||
onPressed: () {
|
|
||||||
setState(() {
|
|
||||||
if (_controller.isAnimating) {
|
|
||||||
_controller.stop();
|
|
||||||
} else {
|
|
||||||
_controller.repeat();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
160
example/lib/main_app.dart
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:logging/logging.dart';
|
||||||
|
import 'package:lottie/lottie.dart';
|
||||||
|
import 'src/all_files.g.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
Logger.root
|
||||||
|
..level = Level.ALL
|
||||||
|
..onRecord.listen(print);
|
||||||
|
Lottie.traceEnabled = true;
|
||||||
|
runApp(App());
|
||||||
|
}
|
||||||
|
|
||||||
|
class App extends StatelessWidget {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return MaterialApp(
|
||||||
|
//showPerformanceOverlay: true,
|
||||||
|
home: Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: Text('Lottie Flutter'),
|
||||||
|
),
|
||||||
|
body: GridView.builder(
|
||||||
|
itemCount: files.length,
|
||||||
|
gridDelegate:
|
||||||
|
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4),
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
var assetName = files[index];
|
||||||
|
return GestureDetector(
|
||||||
|
child: _Item(
|
||||||
|
child: Lottie.asset(
|
||||||
|
assetName,
|
||||||
|
frameBuilder: (context, child, composition) {
|
||||||
|
return AnimatedOpacity(
|
||||||
|
child: child,
|
||||||
|
opacity: composition == null ? 0 : 1,
|
||||||
|
duration: const Duration(seconds: 1),
|
||||||
|
curve: Curves.easeOut,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onTap: () {
|
||||||
|
Navigator.of(context).push(MaterialPageRoute<void>(
|
||||||
|
builder: (context) => Detail(assetName)));
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _Item extends StatelessWidget {
|
||||||
|
final Widget child;
|
||||||
|
|
||||||
|
const _Item({Key key, this.child}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(10)),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: Colors.black.withOpacity(0.1),
|
||||||
|
offset: Offset(2, 2),
|
||||||
|
blurRadius: 5)
|
||||||
|
]),
|
||||||
|
child: child,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Detail extends StatefulWidget {
|
||||||
|
final String assetName;
|
||||||
|
|
||||||
|
const Detail(this.assetName, {Key key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_DetailState createState() => _DetailState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _DetailState extends State<Detail> with TickerProviderStateMixin {
|
||||||
|
AnimationController _controller;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
|
||||||
|
_controller = AnimationController(vsync: this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_controller.dispose();
|
||||||
|
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: Text('${widget.assetName}'),
|
||||||
|
),
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Center(
|
||||||
|
child: Lottie.asset(
|
||||||
|
widget.assetName,
|
||||||
|
controller: _controller,
|
||||||
|
onLoaded: (composition) {
|
||||||
|
_controller.duration = composition.duration;
|
||||||
|
_controller.repeat();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
AnimatedBuilder(
|
||||||
|
animation: _controller,
|
||||||
|
builder: (context, _) => Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: Slider(
|
||||||
|
value: _controller.value,
|
||||||
|
onChanged: (newValue) {
|
||||||
|
_controller.value = newValue;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
|
icon: Icon(_controller.isAnimating
|
||||||
|
? Icons.stop
|
||||||
|
: Icons.play_arrow),
|
||||||
|
onPressed: () {
|
||||||
|
setState(() {
|
||||||
|
if (_controller.isAnimating) {
|
||||||
|
_controller.stop();
|
||||||
|
} else {
|
||||||
|
_controller.repeat();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
// Generated from tool/generate_file_list.dart
|
// Generated from tool/generate_file_list.dart
|
||||||
final files = [
|
final files = [
|
||||||
'assets/14595-thumbs-up.json',
|
'assets/14595-thumbs-up.json',
|
||||||
|
'assets/17297-fireworks.json',
|
||||||
'assets/AndroidWave.json',
|
'assets/AndroidWave.json',
|
||||||
'assets/DynamicGradient.json',
|
'assets/DynamicGradient.json',
|
||||||
'assets/HamburgerArrow.json',
|
'assets/HamburgerArrow.json',
|
||||||
@ -106,6 +107,10 @@ final files = [
|
|||||||
'assets/Tests/dalek_converted.json',
|
'assets/Tests/dalek_converted.json',
|
||||||
'assets/Tests/hd.json',
|
'assets/Tests/hd.json',
|
||||||
'assets/Tests/map.zip',
|
'assets/Tests/map.zip',
|
||||||
|
'assets/TwitterHeartButton.json',
|
||||||
|
'assets/_loading_indicator.json',
|
||||||
|
'assets/bluetoothscanning.json',
|
||||||
|
'assets/example_with_images/data.json',
|
||||||
'assets/lf20_w2Afea.json',
|
'assets/lf20_w2Afea.json',
|
||||||
'assets/lottiefiles/100_percent.json',
|
'assets/lottiefiles/100_percent.json',
|
||||||
'assets/lottiefiles/Plane.json',
|
'assets/lottiefiles/Plane.json',
|
||||||
@ -340,4 +345,11 @@ final files = [
|
|||||||
'assets/lottiefiles/xuanwheel_logo.json',
|
'assets/lottiefiles/xuanwheel_logo.json',
|
||||||
'assets/lottiefiles/yoga_carpet.json',
|
'assets/lottiefiles/yoga_carpet.json',
|
||||||
'assets/lottiefiles/youtube_icon_reveal.json',
|
'assets/lottiefiles/youtube_icon_reveal.json',
|
||||||
|
'assets/playing.json',
|
||||||
|
'assets/weather/_hurricane.json',
|
||||||
|
'assets/weather/fog.json',
|
||||||
|
'assets/weather/hurricane.json',
|
||||||
|
'assets/weather/thunder-storm.json',
|
||||||
|
'assets/weather/tornado.json',
|
||||||
|
'assets/weather/windy.json',
|
||||||
];
|
];
|
||||||
|
@ -1 +1,2 @@
|
|||||||
|
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
|
||||||
#include "ephemeral/Flutter-Generated.xcconfig"
|
#include "ephemeral/Flutter-Generated.xcconfig"
|
||||||
|
@ -1 +1,2 @@
|
|||||||
|
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
|
||||||
#include "ephemeral/Flutter-Generated.xcconfig"
|
#include "ephemeral/Flutter-Generated.xcconfig"
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
import FlutterMacOS
|
import FlutterMacOS
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
|
import path_provider_macos
|
||||||
|
|
||||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||||
|
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||||
}
|
}
|
||||||
|
82
example/macos/Podfile
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
platform :osx, '10.11'
|
||||||
|
|
||||||
|
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||||
|
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||||
|
|
||||||
|
project 'Runner', {
|
||||||
|
'Debug' => :debug,
|
||||||
|
'Profile' => :release,
|
||||||
|
'Release' => :release,
|
||||||
|
}
|
||||||
|
|
||||||
|
def parse_KV_file(file, separator='=')
|
||||||
|
file_abs_path = File.expand_path(file)
|
||||||
|
if !File.exists? file_abs_path
|
||||||
|
return [];
|
||||||
|
end
|
||||||
|
pods_ary = []
|
||||||
|
skip_line_start_symbols = ["#", "/"]
|
||||||
|
File.foreach(file_abs_path) { |line|
|
||||||
|
next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
|
||||||
|
plugin = line.split(pattern=separator)
|
||||||
|
if plugin.length == 2
|
||||||
|
podname = plugin[0].strip()
|
||||||
|
path = plugin[1].strip()
|
||||||
|
podpath = File.expand_path("#{path}", file_abs_path)
|
||||||
|
pods_ary.push({:name => podname, :path => podpath});
|
||||||
|
else
|
||||||
|
puts "Invalid plugin specification: #{line}"
|
||||||
|
end
|
||||||
|
}
|
||||||
|
return pods_ary
|
||||||
|
end
|
||||||
|
|
||||||
|
def pubspec_supports_macos(file)
|
||||||
|
file_abs_path = File.expand_path(file)
|
||||||
|
if !File.exists? file_abs_path
|
||||||
|
return false;
|
||||||
|
end
|
||||||
|
File.foreach(file_abs_path) { |line|
|
||||||
|
return true if line =~ /^\s*macos:/
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
target 'Runner' do
|
||||||
|
use_frameworks!
|
||||||
|
use_modular_headers!
|
||||||
|
|
||||||
|
# Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
|
||||||
|
# referring to absolute paths on developers' machines.
|
||||||
|
ephemeral_dir = File.join('Flutter', 'ephemeral')
|
||||||
|
symlink_dir = File.join(ephemeral_dir, '.symlinks')
|
||||||
|
symlink_plugins_dir = File.join(symlink_dir, 'plugins')
|
||||||
|
system("rm -rf #{symlink_dir}")
|
||||||
|
system("mkdir -p #{symlink_plugins_dir}")
|
||||||
|
|
||||||
|
# Flutter Pods
|
||||||
|
generated_xcconfig = parse_KV_file(File.join(ephemeral_dir, 'Flutter-Generated.xcconfig'))
|
||||||
|
if generated_xcconfig.empty?
|
||||||
|
puts "Flutter-Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first."
|
||||||
|
end
|
||||||
|
generated_xcconfig.map { |p|
|
||||||
|
if p[:name] == 'FLUTTER_FRAMEWORK_DIR'
|
||||||
|
symlink = File.join(symlink_dir, 'flutter')
|
||||||
|
File.symlink(File.dirname(p[:path]), symlink)
|
||||||
|
pod 'FlutterMacOS', :path => File.join(symlink, File.basename(p[:path]))
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
# Plugin Pods
|
||||||
|
plugin_pods = parse_KV_file('../.flutter-plugins')
|
||||||
|
plugin_pods.map { |p|
|
||||||
|
symlink = File.join(symlink_plugins_dir, p[:name])
|
||||||
|
File.symlink(p[:path], symlink)
|
||||||
|
if pubspec_supports_macos(File.join(symlink, 'pubspec.yaml'))
|
||||||
|
pod p[:name], :path => File.join(symlink, 'macos')
|
||||||
|
end
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system.
|
||||||
|
install! 'cocoapods', :disable_input_output_paths => true
|
27
example/macos/Podfile.lock
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
PODS:
|
||||||
|
- FlutterMacOS (1.0.0)
|
||||||
|
- path_provider (0.0.1)
|
||||||
|
- path_provider_macos (0.0.1):
|
||||||
|
- FlutterMacOS
|
||||||
|
|
||||||
|
DEPENDENCIES:
|
||||||
|
- FlutterMacOS (from `Flutter/ephemeral/.symlinks/flutter/darwin-x64-profile`)
|
||||||
|
- path_provider (from `Flutter/ephemeral/.symlinks/plugins/path_provider/macos`)
|
||||||
|
- path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`)
|
||||||
|
|
||||||
|
EXTERNAL SOURCES:
|
||||||
|
FlutterMacOS:
|
||||||
|
:path: Flutter/ephemeral/.symlinks/flutter/darwin-x64-profile
|
||||||
|
path_provider:
|
||||||
|
:path: Flutter/ephemeral/.symlinks/plugins/path_provider/macos
|
||||||
|
path_provider_macos:
|
||||||
|
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos
|
||||||
|
|
||||||
|
SPEC CHECKSUMS:
|
||||||
|
FlutterMacOS: 15bea8a44d2fa024068daa0140371c020b4b6ff9
|
||||||
|
path_provider: e0848572d1d38b9a7dd099e79cf83f5b7e2cde9f
|
||||||
|
path_provider_macos: a0a3fd666cb7cd0448e936fb4abad4052961002b
|
||||||
|
|
||||||
|
PODFILE CHECKSUM: d8ba9b3e9e93c62c74a660b46c6fcb09f03991a7
|
||||||
|
|
||||||
|
COCOAPODS: 1.9.1
|
@ -30,6 +30,7 @@
|
|||||||
33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
D73912F022F37F9E000D13A0 /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; };
|
D73912F022F37F9E000D13A0 /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; };
|
||||||
D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = D73912EF22F37F9E000D13A0 /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
|
F03CC91740A974D36C2A6384 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0BC6FF5FCD90624533CC60DB /* Pods_Runner.framework */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
@ -58,9 +59,12 @@
|
|||||||
/* End PBXCopyFilesBuildPhase section */
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
07433C750748E9780BC34A17 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
0BC6FF5FCD90624533CC60DB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
10F2CF3D6900CD627E92FAFB /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
|
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
|
||||||
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
|
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
|
||||||
33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
|
33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
|
||||||
33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
||||||
@ -73,6 +77,7 @@
|
|||||||
33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
|
33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
|
||||||
33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
|
33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
|
||||||
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
|
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
|
||||||
|
5B4C0E87024EC2686CA05E23 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
|
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
|
||||||
D73912EF22F37F9E000D13A0 /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/ephemeral/App.framework; sourceTree = SOURCE_ROOT; };
|
D73912EF22F37F9E000D13A0 /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/ephemeral/App.framework; sourceTree = SOURCE_ROOT; };
|
||||||
@ -85,6 +90,7 @@
|
|||||||
files = (
|
files = (
|
||||||
D73912F022F37F9E000D13A0 /* App.framework in Frameworks */,
|
D73912F022F37F9E000D13A0 /* App.framework in Frameworks */,
|
||||||
33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */,
|
33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */,
|
||||||
|
F03CC91740A974D36C2A6384 /* Pods_Runner.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@ -109,6 +115,7 @@
|
|||||||
33CEB47122A05771004F2AC0 /* Flutter */,
|
33CEB47122A05771004F2AC0 /* Flutter */,
|
||||||
33CC10EE2044A3C60003C045 /* Products */,
|
33CC10EE2044A3C60003C045 /* Products */,
|
||||||
D73912EC22F37F3D000D13A0 /* Frameworks */,
|
D73912EC22F37F3D000D13A0 /* Frameworks */,
|
||||||
|
E1769B635E3D601E790C66A4 /* Pods */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
@ -160,10 +167,22 @@
|
|||||||
D73912EC22F37F3D000D13A0 /* Frameworks */ = {
|
D73912EC22F37F3D000D13A0 /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
0BC6FF5FCD90624533CC60DB /* Pods_Runner.framework */,
|
||||||
);
|
);
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
E1769B635E3D601E790C66A4 /* Pods */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
10F2CF3D6900CD627E92FAFB /* Pods-Runner.debug.xcconfig */,
|
||||||
|
07433C750748E9780BC34A17 /* Pods-Runner.release.xcconfig */,
|
||||||
|
5B4C0E87024EC2686CA05E23 /* Pods-Runner.profile.xcconfig */,
|
||||||
|
);
|
||||||
|
name = Pods;
|
||||||
|
path = Pods;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
@ -171,11 +190,13 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
|
buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
66E2D04933C70A4FC0890B06 /* [CP] Check Pods Manifest.lock */,
|
||||||
33CC10E92044A3C60003C045 /* Sources */,
|
33CC10E92044A3C60003C045 /* Sources */,
|
||||||
33CC10EA2044A3C60003C045 /* Frameworks */,
|
33CC10EA2044A3C60003C045 /* Frameworks */,
|
||||||
33CC10EB2044A3C60003C045 /* Resources */,
|
33CC10EB2044A3C60003C045 /* Resources */,
|
||||||
33CC110E2044A8840003C045 /* Bundle Framework */,
|
33CC110E2044A8840003C045 /* Bundle Framework */,
|
||||||
3399D490228B24CF009A79C7 /* ShellScript */,
|
3399D490228B24CF009A79C7 /* ShellScript */,
|
||||||
|
F22406C58ADF93CA802196B1 /* [CP] Embed Pods Frameworks */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
@ -282,6 +303,43 @@
|
|||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh\ntouch Flutter/ephemeral/tripwire\n";
|
shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh\ntouch Flutter/ephemeral/tripwire\n";
|
||||||
};
|
};
|
||||||
|
66E2D04933C70A4FC0890B06 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
F22406C58ADF93CA802196B1 /* [CP] Embed Pods Frameworks */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
name = "[CP] Embed Pods Frameworks";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
@ -4,4 +4,7 @@
|
|||||||
<FileRef
|
<FileRef
|
||||||
location = "group:Runner.xcodeproj">
|
location = "group:Runner.xcodeproj">
|
||||||
</FileRef>
|
</FileRef>
|
||||||
|
<FileRef
|
||||||
|
location = "group:Pods/Pods.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
</Workspace>
|
</Workspace>
|
||||||
|
@ -4,8 +4,14 @@
|
|||||||
<dict>
|
<dict>
|
||||||
<key>com.apple.security.app-sandbox</key>
|
<key>com.apple.security.app-sandbox</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>com.apple.security.assets.pictures.read-write</key>
|
||||||
|
<true/>
|
||||||
<key>com.apple.security.cs.allow-jit</key>
|
<key>com.apple.security.cs.allow-jit</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>com.apple.security.files.downloads.read-write</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.files.user-selected.read-write</key>
|
||||||
|
<true/>
|
||||||
<key>com.apple.security.network.client</key>
|
<key>com.apple.security.network.client</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.network.server</key>
|
<key>com.apple.security.network.server</key>
|
||||||
|
@ -4,6 +4,12 @@
|
|||||||
<dict>
|
<dict>
|
||||||
<key>com.apple.security.app-sandbox</key>
|
<key>com.apple.security.app-sandbox</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>com.apple.security.assets.pictures.read-write</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.files.downloads.read-write</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.files.user-selected.read-write</key>
|
||||||
|
<true/>
|
||||||
<key>com.apple.security.network.client</key>
|
<key>com.apple.security.network.client</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.network.server</key>
|
<key>com.apple.security.network.server</key>
|
||||||
|
@ -21,35 +21,42 @@ packages:
|
|||||||
name: async
|
name: async
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.0"
|
version: "2.5.0-nullsafety.1"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: boolean_selector
|
name: boolean_selector
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.5"
|
version: "2.1.0-nullsafety.1"
|
||||||
characters:
|
characters:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: characters
|
name: characters
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.5.0"
|
version: "1.1.0-nullsafety.3"
|
||||||
charcode:
|
charcode:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: charcode
|
name: charcode
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.2"
|
version: "1.2.0-nullsafety.1"
|
||||||
|
clock:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: clock
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.1.0-nullsafety.1"
|
||||||
collection:
|
collection:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: collection
|
name: collection
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.14.11"
|
version: "1.15.0-nullsafety.3"
|
||||||
convert:
|
convert:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -64,6 +71,27 @@ packages:
|
|||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.3"
|
version: "2.1.3"
|
||||||
|
fake_async:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: fake_async
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.2.0-nullsafety.1"
|
||||||
|
ffi:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: ffi
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.3"
|
||||||
|
file:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: file
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "5.2.1"
|
||||||
flutter:
|
flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description: flutter
|
description: flutter
|
||||||
@ -75,7 +103,7 @@ packages:
|
|||||||
name: flutter_colorpicker
|
name: flutter_colorpicker
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.3.2"
|
version: "0.3.4"
|
||||||
flutter_test:
|
flutter_test:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description: flutter
|
description: flutter
|
||||||
@ -87,14 +115,28 @@ packages:
|
|||||||
name: golden_toolkit
|
name: golden_toolkit
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.2.1"
|
version: "0.6.0"
|
||||||
image:
|
http:
|
||||||
dependency: transitive
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: image
|
name: http
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.4"
|
version: "0.12.2"
|
||||||
|
http_parser:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: http_parser
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "3.1.4"
|
||||||
|
intl:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: intl
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.16.1"
|
||||||
logging:
|
logging:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -108,49 +150,91 @@ packages:
|
|||||||
path: ".."
|
path: ".."
|
||||||
relative: true
|
relative: true
|
||||||
source: path
|
source: path
|
||||||
version: "0.3.2"
|
version: "0.7.0+1"
|
||||||
matcher:
|
matcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: matcher
|
name: matcher
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.12.6"
|
version: "0.12.10-nullsafety.1"
|
||||||
meta:
|
meta:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.8"
|
version: "1.3.0-nullsafety.3"
|
||||||
path:
|
path:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path
|
name: path
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.6.4"
|
version: "1.8.0-nullsafety.1"
|
||||||
|
path_provider:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: path_provider
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.6.21"
|
||||||
|
path_provider_linux:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: path_provider_linux
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.0.1+2"
|
||||||
|
path_provider_macos:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: path_provider_macos
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.0.4+4"
|
||||||
|
path_provider_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: path_provider_platform_interface
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.3"
|
||||||
|
path_provider_windows:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: path_provider_windows
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.0.4+1"
|
||||||
pedantic:
|
pedantic:
|
||||||
dependency: "direct overridden"
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: pedantic
|
name: pedantic
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.9.0"
|
version: "1.8.0+1"
|
||||||
petitparser:
|
platform:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: petitparser
|
name: platform
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.0"
|
version: "2.2.1"
|
||||||
quiver:
|
plugin_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: quiver
|
name: plugin_platform_interface
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.5"
|
version: "1.0.3"
|
||||||
|
process:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: process
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "3.0.13"
|
||||||
sky_engine:
|
sky_engine:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
@ -162,63 +246,70 @@ packages:
|
|||||||
name: source_span
|
name: source_span
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.5.5"
|
version: "1.8.0-nullsafety.2"
|
||||||
stack_trace:
|
stack_trace:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: stack_trace
|
name: stack_trace
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.9.3"
|
version: "1.10.0-nullsafety.1"
|
||||||
stream_channel:
|
stream_channel:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: stream_channel
|
name: stream_channel
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.1.0-nullsafety.1"
|
||||||
string_scanner:
|
string_scanner:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: string_scanner
|
name: string_scanner
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.5"
|
version: "1.1.0-nullsafety.1"
|
||||||
term_glyph:
|
term_glyph:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: term_glyph
|
name: term_glyph
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.0"
|
version: "1.2.0-nullsafety.1"
|
||||||
test_api:
|
test_api:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.2.15"
|
version: "0.2.19-nullsafety.2"
|
||||||
typed_data:
|
typed_data:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: typed_data
|
name: typed_data
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.6"
|
version: "1.3.0-nullsafety.3"
|
||||||
vector_math:
|
vector_math:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vector_math
|
name: vector_math
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.8"
|
version: "2.1.0-nullsafety.3"
|
||||||
xml:
|
win32:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: xml
|
name: win32
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.5.0"
|
version: "1.7.3"
|
||||||
|
xdg_directories:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: xdg_directories
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.0"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=2.7.0 <3.0.0"
|
dart: ">=2.10.0-110 <2.11.0"
|
||||||
flutter: ">=1.5.4 <2.0.0"
|
flutter: ">=1.12.13+hotfix.5 <2.0.0"
|
||||||
|
@ -8,18 +8,17 @@ environment:
|
|||||||
dependencies:
|
dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
flutter_colorpicker:
|
||||||
|
http:
|
||||||
lottie:
|
lottie:
|
||||||
path: ../
|
path: ../
|
||||||
flutter_colorpicker:
|
path_provider:
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
golden_toolkit:
|
golden_toolkit:
|
||||||
|
|
||||||
dependency_overrides:
|
|
||||||
pedantic: ^1.9.0
|
|
||||||
|
|
||||||
# For information on the generic Dart part of this file, see the
|
# For information on the generic Dart part of this file, see the
|
||||||
# following page: https://dart.dev/tools/pub/pubspec
|
# following page: https://dart.dev/tools/pub/pubspec
|
||||||
|
|
||||||
@ -35,6 +34,9 @@ flutter:
|
|||||||
- assets/Logo/
|
- assets/Logo/
|
||||||
- assets/Images/
|
- assets/Images/
|
||||||
- assets/Images/WeAccept/
|
- assets/Images/WeAccept/
|
||||||
|
- assets/weather/
|
||||||
|
- assets/example_with_images/
|
||||||
|
- assets/example_with_images/images/
|
||||||
|
|
||||||
fonts:
|
fonts:
|
||||||
- family: Comic Neue
|
- family: Comic Neue
|
||||||
|
1
example/test/data/loading_indicator.json
Normal file
1850
example/test/data/warningShimmer.json
Normal file
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter/painting.dart';
|
import 'package:flutter/painting.dart';
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:lottie/lottie.dart';
|
import 'package:lottie/lottie.dart';
|
||||||
|
import 'utils.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
LottieComposition composition;
|
LottieComposition composition;
|
||||||
@ -21,6 +22,9 @@ void main() {
|
|||||||
.replaceAll(' ', '_');
|
.replaceAll(' ', '_');
|
||||||
|
|
||||||
testWidgets(description, (tester) async {
|
testWidgets(description, (tester) async {
|
||||||
|
tester.binding.window.physicalSizeTestValue = Size(500, 400);
|
||||||
|
tester.binding.window.devicePixelRatioTestValue = 1.0;
|
||||||
|
|
||||||
var animation =
|
var animation =
|
||||||
AnimationController(vsync: tester, duration: composition.duration);
|
AnimationController(vsync: tester, duration: composition.duration);
|
||||||
if (progress != null) {
|
if (progress != null) {
|
||||||
@ -32,6 +36,7 @@ void main() {
|
|||||||
composition: composition,
|
composition: composition,
|
||||||
controller: animation,
|
controller: animation,
|
||||||
delegates: LottieDelegates(values: [delegate]),
|
delegates: LottieDelegates(values: [delegate]),
|
||||||
|
addRepaintBoundary: false,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
@ -44,6 +49,7 @@ void main() {
|
|||||||
composition: composition,
|
composition: composition,
|
||||||
controller: animation,
|
controller: animation,
|
||||||
delegates: LottieDelegates(values: []),
|
delegates: LottieDelegates(values: []),
|
||||||
|
addRepaintBoundary: false,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
@ -290,4 +296,54 @@ void main() {
|
|||||||
.round()),
|
.round()),
|
||||||
progress: progress);
|
progress: progress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testWidgets('warningShimmer', (tester) async {
|
||||||
|
var size = Size(500, 400);
|
||||||
|
tester.binding.window.physicalSizeTestValue = size;
|
||||||
|
tester.binding.window.devicePixelRatioTestValue = 1.0;
|
||||||
|
|
||||||
|
var composition = await LottieComposition.fromBytes(
|
||||||
|
File('test/data/warningShimmer.json').readAsBytesSync());
|
||||||
|
|
||||||
|
var delegates = <String, List<ValueDelegate>>{
|
||||||
|
'1': [
|
||||||
|
for (var i in ['1', '2', '5'])
|
||||||
|
ValueDelegate.color(['Layer $i Outlines', '**'], value: Colors.red),
|
||||||
|
for (var i in ['3', '4'])
|
||||||
|
ValueDelegate.color(['Layer $i Outlines', '**'],
|
||||||
|
value: Colors.greenAccent),
|
||||||
|
],
|
||||||
|
'2': [
|
||||||
|
for (var i in ['1', '2', '5'])
|
||||||
|
ValueDelegate.color(['Layer $i Outlines', 'Group 1', '*'],
|
||||||
|
value: Colors.red),
|
||||||
|
for (var i in ['3', '4'])
|
||||||
|
ValueDelegate.color(['Layer $i Outlines', 'Group 1', '*'],
|
||||||
|
value: Colors.greenAccent),
|
||||||
|
],
|
||||||
|
'3': [
|
||||||
|
for (var i in ['1', '2', '5'])
|
||||||
|
ValueDelegate.color(['Layer $i Outlines', 'Group 1', 'Fill 1'],
|
||||||
|
value: Colors.red),
|
||||||
|
for (var i in ['3', '4'])
|
||||||
|
ValueDelegate.color(['Layer $i Outlines', 'Group 1', 'Fill 1'],
|
||||||
|
value: Colors.greenAccent),
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var variant in delegates.entries) {
|
||||||
|
await tester.pumpWidget(
|
||||||
|
FilmStrip(
|
||||||
|
composition,
|
||||||
|
size: size,
|
||||||
|
delegates: LottieDelegates(
|
||||||
|
values: variant.value,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
await expectLater(find.byType(FilmStrip),
|
||||||
|
matchesGoldenFile('goldens/warningShimmer_${variant.key}.png'));
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,9 @@ import 'package:lottie/lottie.dart';
|
|||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
testWidgets('Dynamic test', (tester) async {
|
testWidgets('Dynamic test', (tester) async {
|
||||||
|
tester.binding.window.physicalSizeTestValue = Size(500, 400);
|
||||||
|
tester.binding.window.devicePixelRatioTestValue = 1.0;
|
||||||
|
|
||||||
var composition = await LottieComposition.fromBytes(
|
var composition = await LottieComposition.fromBytes(
|
||||||
File('assets/Tests/DynamicText.json').readAsBytesSync());
|
File('assets/Tests/DynamicText.json').readAsBytesSync());
|
||||||
|
|
||||||
|
32
example/test/golden_test.dart
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
import 'dart:ui';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:lottie/lottie.dart';
|
||||||
|
import 'package:path/path.dart' as p;
|
||||||
|
import 'utils.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
var root = 'assets';
|
||||||
|
for (var asset in Directory(root)
|
||||||
|
.listSync(recursive: true)
|
||||||
|
.whereType<File>()
|
||||||
|
.where((f) => const ['.json', '.zip'].contains(p.extension(f.path)))) {
|
||||||
|
testWidgets('Goldens ${asset.path}', (tester) async {
|
||||||
|
var size = Size(500, 400);
|
||||||
|
tester.binding.window.physicalSizeTestValue = size;
|
||||||
|
tester.binding.window.devicePixelRatioTestValue = 1.0;
|
||||||
|
var composition = await tester.runAsync(() => FileLottie(asset).load());
|
||||||
|
|
||||||
|
await tester.pumpWidget(FilmStrip(composition, size: size));
|
||||||
|
|
||||||
|
var folder = p.relative(asset.path, from: root);
|
||||||
|
var fileName =
|
||||||
|
'${p.basenameWithoutExtension(asset.path)}.png'.toLowerCase();
|
||||||
|
await expectLater(
|
||||||
|
find.byType(FilmStrip),
|
||||||
|
matchesGoldenFile(
|
||||||
|
p.join('goldens/all', p.dirname(folder), fileName)));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
BIN
example/test/goldens/all/14595-thumbs-up.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
example/test/goldens/all/17297-fireworks.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
example/test/goldens/all/Logo/logosmall.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
example/test/goldens/all/Mobilo/a.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
example/test/goldens/all/Mobilo/apostrophe.png
Normal file
After Width: | Height: | Size: 7.1 KiB |
BIN
example/test/goldens/all/Mobilo/b.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
example/test/goldens/all/Mobilo/blinkingcursor.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
example/test/goldens/all/Mobilo/c.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
example/test/goldens/all/Mobilo/colon.png
Normal file
After Width: | Height: | Size: 5.7 KiB |
BIN
example/test/goldens/all/Mobilo/comma.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
example/test/goldens/all/Mobilo/d.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
example/test/goldens/all/Mobilo/e.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
example/test/goldens/all/Mobilo/f.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
example/test/goldens/all/Mobilo/g.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
BIN
example/test/goldens/all/Mobilo/h.png
Normal file
After Width: | Height: | Size: 7.7 KiB |
BIN
example/test/goldens/all/Mobilo/i.png
Normal file
After Width: | Height: | Size: 6.4 KiB |
BIN
example/test/goldens/all/Mobilo/j.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
example/test/goldens/all/Mobilo/k.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
example/test/goldens/all/Mobilo/l.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
example/test/goldens/all/Mobilo/m.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
example/test/goldens/all/Mobilo/n.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
example/test/goldens/all/Mobilo/o.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
example/test/goldens/all/Mobilo/p.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
example/test/goldens/all/Mobilo/q.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
example/test/goldens/all/Mobilo/r.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
example/test/goldens/all/Mobilo/s.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
example/test/goldens/all/Mobilo/t.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
example/test/goldens/all/Mobilo/u.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
example/test/goldens/all/Mobilo/v.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
example/test/goldens/all/Mobilo/w.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
example/test/goldens/all/Mobilo/x.png
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
example/test/goldens/all/Mobilo/y.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
example/test/goldens/all/Mobilo/z.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
example/test/goldens/all/Tests/2frameanimation.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
example/test/goldens/all/Tests/2parentsmatte.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
example/test/goldens/all/Tests/adrock.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
example/test/goldens/all/Tests/adrock_converted.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
example/test/goldens/all/Tests/airbnb.png
Normal file
After Width: | Height: | Size: 36 KiB |