mirror of
https://github.com/xvrh/lottie-flutter.git
synced 2025-08-06 16:39:36 +08:00
First implementation based on android
This commit is contained in:
83
lib/src/parser/animatable_path_value_parser.dart
Normal file
83
lib/src/parser/animatable_path_value_parser.dart
Normal file
@ -0,0 +1,83 @@
|
||||
import 'dart:ui';
|
||||
import '../composition.dart';
|
||||
import '../model/animatable/animatable_double_value.dart';
|
||||
import '../model/animatable/animatable_path_value.dart';
|
||||
import '../model/animatable/animatable_split_dimension_path_value.dart';
|
||||
import '../model/animatable/animatable_value.dart';
|
||||
import '../value/keyframe.dart';
|
||||
import 'animatable_value_parser.dart';
|
||||
import 'json_utils.dart';
|
||||
import 'keyframes_parser.dart';
|
||||
import 'moshi/json_reader.dart';
|
||||
import 'path_keyframe_parser.dart';
|
||||
|
||||
class AnimatablePathValueParser {
|
||||
static final _NAMES = JsonReaderOptions.of(['k', 'x', 'y']);
|
||||
|
||||
AnimatablePathValueParser._();
|
||||
|
||||
static AnimatablePathValue parse(
|
||||
JsonReader reader, LottieComposition composition) {
|
||||
var keyframes = <Keyframe<Offset>>[];
|
||||
if (reader.peek() == Token.BEGIN_ARRAY) {
|
||||
reader.beginArray();
|
||||
while (reader.hasNext()) {
|
||||
keyframes.add(PathKeyframeParser.parse(reader, composition));
|
||||
}
|
||||
reader.endArray();
|
||||
KeyframesParser.setEndFrames(keyframes);
|
||||
} else {
|
||||
keyframes.add(Keyframe<Offset>.nonAnimated(
|
||||
JsonUtils.jsonToPoint(reader, window.devicePixelRatio)));
|
||||
}
|
||||
return AnimatablePathValue.fromKeyframes(keyframes);
|
||||
}
|
||||
|
||||
/// Returns either an {@link AnimatablePathValue} or an {@link AnimatableSplitDimensionPathValue}.
|
||||
static AnimatableValue<Offset, Offset> parseSplitPath(
|
||||
JsonReader reader, LottieComposition composition) {
|
||||
AnimatablePathValue pathAnimation;
|
||||
AnimatableDoubleValue xAnimation;
|
||||
AnimatableDoubleValue yAnimation;
|
||||
|
||||
var hasExpressions = false;
|
||||
|
||||
reader.beginObject();
|
||||
while (reader.peek() != Token.END_OBJECT) {
|
||||
switch (reader.selectName(_NAMES)) {
|
||||
case 0:
|
||||
pathAnimation = AnimatablePathValueParser.parse(reader, composition);
|
||||
break;
|
||||
case 1:
|
||||
if (reader.peek() == Token.STRING) {
|
||||
hasExpressions = true;
|
||||
reader.skipValue();
|
||||
} else {
|
||||
xAnimation = AnimatableValueParser.parseFloat(reader, composition);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (reader.peek() == Token.STRING) {
|
||||
hasExpressions = true;
|
||||
reader.skipValue();
|
||||
} else {
|
||||
yAnimation = AnimatableValueParser.parseFloat(reader, composition);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
reader.skipName();
|
||||
reader.skipValue();
|
||||
}
|
||||
}
|
||||
reader.endObject();
|
||||
|
||||
if (hasExpressions) {
|
||||
composition.addWarning("Lottie doesn't support expressions.");
|
||||
}
|
||||
|
||||
if (pathAnimation != null) {
|
||||
return pathAnimation;
|
||||
}
|
||||
return AnimatableSplitDimensionPathValue(xAnimation, yAnimation);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user