blob: c3acfb3d0f5c0665a0b7f0da1d80ffe4b3c9d1ce [file] [log] [blame]
package com.airbnb.lottie.parser;
import android.graphics.PointF;
import com.airbnb.lottie.LottieComposition;
import com.airbnb.lottie.model.animatable.AnimatableFloatValue;
import com.airbnb.lottie.model.animatable.AnimatablePathValue;
import com.airbnb.lottie.model.animatable.AnimatableSplitDimensionPathValue;
import com.airbnb.lottie.model.animatable.AnimatableValue;
import com.airbnb.lottie.parser.moshi.JsonReader;
import com.airbnb.lottie.utils.Utils;
import com.airbnb.lottie.value.Keyframe;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class AnimatablePathValueParser {
private static final JsonReader.Options NAMES = JsonReader.Options.of(
"k",
"x",
"y"
);
private AnimatablePathValueParser() {
}
public static AnimatablePathValue parse(
JsonReader reader, LottieComposition composition) throws IOException {
List<Keyframe<PointF>> keyframes = new ArrayList<>();
if (reader.peek() == JsonReader.Token.BEGIN_ARRAY) {
reader.beginArray();
while (reader.hasNext()) {
keyframes.add(PathKeyframeParser.parse(reader, composition));
}
reader.endArray();
KeyframesParser.setEndFrames(keyframes);
} else {
keyframes.add(new Keyframe<>(JsonUtils.jsonToPoint(reader, Utils.dpScale())));
}
return new AnimatablePathValue(keyframes);
}
/**
* Returns either an {@link AnimatablePathValue} or an {@link AnimatableSplitDimensionPathValue}.
*/
static AnimatableValue<PointF, PointF> parseSplitPath(
JsonReader reader, LottieComposition composition) throws IOException {
AnimatablePathValue pathAnimation = null;
AnimatableFloatValue xAnimation = null;
AnimatableFloatValue yAnimation = null;
boolean hasExpressions = false;
reader.beginObject();
while (reader.peek() != JsonReader.Token.END_OBJECT) {
switch (reader.selectName(NAMES)) {
case 0:
pathAnimation = AnimatablePathValueParser.parse(reader, composition);
break;
case 1:
if (reader.peek() == JsonReader.Token.STRING) {
hasExpressions = true;
reader.skipValue();
} else {
xAnimation = AnimatableValueParser.parseFloat(reader, composition);
}
break;
case 2:
if (reader.peek() == JsonReader.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 new AnimatableSplitDimensionPathValue(xAnimation, yAnimation);
}
}