/// <summary> /// Returns either an <see cref="AnimatablePathValue"/> or an <see cref="AnimatableSplitDimensionPathValue"/>. /// </summary> /// <param name="reader"></param> /// <param name="composition"></param> /// <returns></returns> internal static IAnimatableValue <Vector2?, Vector2?> ParseSplitPath(JsonReader reader, LottieComposition composition) { AnimatablePathValue pathAnimation = null; AnimatableFloatValue xAnimation = null; AnimatableFloatValue yAnimation = null; bool hasExpressions = false; reader.BeginObject(); while (reader.Peek() != JsonToken.EndObject) { switch (reader.NextName()) { case "k": pathAnimation = Parse(reader, composition); break; case "x": if (reader.Peek() == JsonToken.String) { hasExpressions = true; reader.SkipValue(); } else { xAnimation = AnimatableValueParser.ParseFloat(reader, composition); } break; case "y": if (reader.Peek() == JsonToken.String) { hasExpressions = true; reader.SkipValue(); } else { yAnimation = AnimatableValueParser.ParseFloat(reader, composition); } break; default: reader.SkipValue(); break; } } reader.EndObject(); if (hasExpressions) { composition.AddWarning("Lottie doesn't support expressions."); } if (pathAnimation != null) { return(pathAnimation); } return(new AnimatableSplitDimensionPathValue(xAnimation, yAnimation)); }
internal static PolystarShape NewInstance(JsonObject json, LottieComposition composition) { var name = json.GetNamedString("nm"); var type = (Type)(int)json.GetNamedNumber("sy"); var points = AnimatableFloatValue.Factory.NewInstance(json.GetNamedObject("pt"), composition, false); var position = AnimatablePathValue.CreateAnimatablePathOrSplitDimensionPath(json.GetNamedObject("p"), composition); var rotation = AnimatableFloatValue.Factory.NewInstance(json.GetNamedObject("r"), composition, false); var outerRadius = AnimatableFloatValue.Factory.NewInstance(json.GetNamedObject("or"), composition); var outerRoundedness = AnimatableFloatValue.Factory.NewInstance(json.GetNamedObject("os"), composition, false); AnimatableFloatValue innerRadius; AnimatableFloatValue innerRoundedness; if (type == Type.Star) { innerRadius = AnimatableFloatValue.Factory.NewInstance(json.GetNamedObject("ir"), composition); innerRoundedness = AnimatableFloatValue.Factory.NewInstance(json.GetNamedObject("is"), composition, false); } else { innerRadius = null; innerRoundedness = null; } return(new PolystarShape(name, type, points, position, rotation, innerRadius, outerRadius, innerRoundedness, outerRoundedness)); }
internal static CircleShape NewInstance(JsonObject json, LottieComposition composition) { return new CircleShape(json.GetNamedString("nm"), AnimatablePathValue.CreateAnimatablePathOrSplitDimensionPath(json.GetNamedObject("p"), composition), AnimatablePointValue.Factory.NewInstance(json.GetNamedObject("s"), composition)); }
public static AnimatableTransform Parse(JsonReader reader, LottieComposition composition) { AnimatablePathValue anchorPoint = null; IAnimatableValue <Vector2?, Vector2?> position = null; AnimatableScaleValue scale = null; AnimatableFloatValue rotation = null; AnimatableIntegerValue opacity = null; AnimatableFloatValue startOpacity = null; AnimatableFloatValue endOpacity = null; bool isObject = reader.Peek() == JsonToken.StartObject; if (isObject) { reader.BeginObject(); } while (reader.HasNext()) { switch (reader.NextName()) { case "a": reader.BeginObject(); while (reader.HasNext()) { if (reader.NextName().Equals("k")) { anchorPoint = AnimatablePathValueParser.Parse(reader, composition); } else { reader.SkipValue(); } } reader.EndObject(); break; case "p": position = AnimatablePathValueParser.ParseSplitPath(reader, composition); break; case "s": scale = AnimatableValueParser.ParseScale(reader, composition); break; case "rz": composition.AddWarning("Lottie doesn't support 3D layers."); rotation = AnimatableValueParser.ParseFloat(reader, composition, false); break; case "r": rotation = AnimatableValueParser.ParseFloat(reader, composition, false); break; case "o": opacity = AnimatableValueParser.ParseInteger(reader, composition); break; case "so": startOpacity = AnimatableValueParser.ParseFloat(reader, composition, false); break; case "eo": endOpacity = AnimatableValueParser.ParseFloat(reader, composition, false); break; default: reader.SkipValue(); break; } } if (isObject) { reader.EndObject(); } if (anchorPoint == null) { // Cameras don't have an anchor point property. Although we don't support them, at least // we won't crash. Debug.WriteLine("Layer has no transform property. You may be using an unsupported layer type such as a camera.", LottieLog.Tag); anchorPoint = new AnimatablePathValue(); } if (scale == null) { // Somehow some community animations don't have scale in the transform. scale = new AnimatableScaleValue(new ScaleXy(1f, 1f)); } if (opacity == null) { // Repeaters have start/end opacity instead of opacity opacity = new AnimatableIntegerValue(); } return(new AnimatableTransform( anchorPoint, position, scale, rotation, opacity, startOpacity, endOpacity)); }