/
LottiePathKeyframeAnimation.java
64 lines (54 loc) · 2.52 KB
/
LottiePathKeyframeAnimation.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.airbnb.lottie.utils;
import android.graphics.PathMeasure;
import android.graphics.PointF;
import android.support.annotation.Nullable;
import android.view.animation.Interpolator;
import java.util.List;
public class LottiePathKeyframeAnimation extends LottieKeyframeAnimation<PointF> {
private final PointF point = new PointF();
private final float[] pos = new float[2];
private final SegmentedPath segmentedPath;
private int pathMeasureKeyframeIndex = -1;
@Nullable private PathMeasure pathMeasure;
public LottiePathKeyframeAnimation(long duration, long compDuration, List<Float> keyTimes, SegmentedPath segmentedPath, List<Interpolator> interpolators) {
super(duration, compDuration, keyTimes, interpolators);
this.segmentedPath = segmentedPath;
}
@Override
public PointF getValue() {
if (progress <= 0f) {
if (pathMeasureKeyframeIndex != 0 || pathMeasure == null) {
pathMeasureKeyframeIndex = 0;
pathMeasure = new PathMeasure(segmentedPath.getSegment(0), false);
}
pathMeasure.getPosTan(0, pos, null);
point.set(pos[0], pos[1]);
return point;
} else if (progress >= 1f) {
if (pathMeasureKeyframeIndex != segmentedPath.getSegmentCount() - 1 || pathMeasure == null) {
pathMeasureKeyframeIndex = segmentedPath.getSegmentCount() - 1;
pathMeasure = new PathMeasure(segmentedPath.getSegment(segmentedPath.getSegmentCount() - 1), false);
}
pathMeasure.getPosTan(pathMeasure.getLength(), pos, null);
point.set(pos[0], pos[1]);
return point;
}
int keyframeIndex = getKeyframeIndex();
if (pathMeasureKeyframeIndex != keyframeIndex) {
pathMeasureKeyframeIndex = keyframeIndex;
pathMeasure = new PathMeasure(segmentedPath.getSegment(keyframeIndex), false);
}
float startKeytime = keyTimes.get(keyframeIndex);
float endKeytime = keyTimes.get(keyframeIndex + 1);
float percentageIntoFrame = 0;
if (!isDiscrete) {
percentageIntoFrame = (progress - startKeytime) / (endKeytime - startKeytime);
if (interpolators != null) {
percentageIntoFrame = interpolators.get(keyframeIndex).getInterpolation(percentageIntoFrame);
}
}
pathMeasure.getPosTan(percentageIntoFrame * pathMeasure.getLength(), pos, null);
point.set(pos[0], pos[1]);
return point;
}
}