Skip to content

Commit f283de5

Browse files
author
Dario Segura
committed
[ANIMATION] Initial implementation of lottie animations
1 parent 784ae29 commit f283de5

File tree

3 files changed

+80
-0
lines changed

3 files changed

+80
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import 'dart:convert';
2+
3+
import 'package:pheno_ui/models/figma_parent_layout_model.dart';
4+
import 'package:pheno_ui/parsers/tools/figma_enum.dart';
5+
import 'fimga_image_model.dart';
6+
7+
class FigmaLottieAnimationModel extends FigmaParentLayoutModel {
8+
final double opacity;
9+
final bool autoplay;
10+
final bool loop;
11+
late final int from;
12+
late final int to;
13+
late final String animation;
14+
final FigmaImageDataMethod method;
15+
16+
FigmaLottieAnimationModel.fromJson(Map<String, dynamic> json):
17+
opacity = json['opacity'].toDouble(),
18+
method = FigmaImageDataMethod.values.byNameDefault(json['__userData']['method'] ?? json['uploadMethod'], FigmaImageDataMethod.embed),
19+
autoplay = json['__userData']['autoplay'] ?? false,
20+
loop = json['__userData']['loop'] ?? false,
21+
super.fromJson(json) {
22+
final data = json['__userData']['animation']['fields'];
23+
animation = data['data'];
24+
from = data['from'];
25+
to = data['to'];
26+
}
27+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import 'dart:convert';
2+
3+
import 'package:flutter/widgets.dart';
4+
import 'package:lottie/lottie.dart';
5+
import 'package:lottie/src/composition.dart'; // ignore: implementation_imports
6+
import 'package:pheno_ui/parsers/tools/figma_dimensions.dart';
7+
8+
import '../models/figma_lottie_animation_model.dart';
9+
import '../pheno_ui.dart';
10+
import '../widgets/figma_node.dart';
11+
12+
class FigmaLottieAnimationParser extends MiraiParser<FigmaLottieAnimationModel> {
13+
const FigmaLottieAnimationParser();
14+
15+
@override
16+
FigmaLottieAnimationModel getModel(Map<String, dynamic> json) =>
17+
FigmaLottieAnimationModel.fromJson(json);
18+
19+
@override
20+
String get type => 'figma-lottie-animation';
21+
22+
@override
23+
Widget parse(BuildContext context, FigmaLottieAnimationModel model) {
24+
final bytes = utf8.encode(model.animation);
25+
26+
Widget widget = Lottie.memory(
27+
bytes,
28+
fit: BoxFit.cover,
29+
animate: model.autoplay,
30+
repeat: model.loop,
31+
onLoaded: (composition) {
32+
var params = CompositionParameters.forComposition(composition);
33+
params.startFrame = model.from.toDouble();
34+
params.endFrame = model.to.toDouble();
35+
},
36+
);
37+
38+
// Widget widget = Lottie.asset(
39+
// 'assets/min_pa_anim_sym_unlocked02.json',
40+
// fit: BoxFit.cover,
41+
// );
42+
43+
44+
widget = FigmaNode.withContext(context,
45+
model: model,
46+
child: widget,
47+
);
48+
49+
return dimensionWrapWidget(widget, model.dimensions!, model.parentLayout!);
50+
}
51+
}

package/pheno_ui/lib/pheno_ui.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:pheno_ui/parsers/figma_checkbox.dart';
55
import 'package:pheno_ui/parsers/figma_conditional_checkbox.dart';
66
import 'package:pheno_ui/parsers/figma_form.dart';
77
import 'package:pheno_ui/parsers/figma_keep_aspect_ratio.dart';
8+
import 'package:pheno_ui/parsers/figma_lottie_animation.dart';
89
import 'package:pheno_ui/parsers/figma_props_from_route.dart';
910
import 'package:pheno_ui/parsers/figma_safe_area.dart';
1011
import 'package:pheno_ui/parsers/figma_component.dart';
@@ -42,6 +43,7 @@ Future<void> initializePhenoUi({List<MiraiParser> parsers = const []}) async {
4243
FigmaTileChildParser(),
4344
FigmaTextFromRouteParser(),
4445
FigmaPropsFromRouteParser(),
46+
FigmaLottieAnimationParser(),
4547
];
4648

4749
// merge the parsers giving priority to the ones passed as argument

0 commit comments

Comments
 (0)