From 504bbdc9a438415f6539edfec3d916f1d8e86e3b Mon Sep 17 00:00:00 2001 From: Erwan Ameil Date: Fri, 2 Feb 2024 23:14:55 +0000 Subject: [PATCH] Better tangent extrapolation implementation when using bounce easings (#2459) --- .../keyframe/PathKeyframeAnimation.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/PathKeyframeAnimation.java b/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/PathKeyframeAnimation.java index 7363f948b..7418405d4 100644 --- a/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/PathKeyframeAnimation.java +++ b/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/PathKeyframeAnimation.java @@ -45,17 +45,14 @@ pathKeyframe.startValue, pathKeyframe.endValue, getLinearCurrentKeyframeProgress float length = pathMeasure.getLength(); - if (keyframeProgress < 0) { - pathMeasure.getPosTan(0, pos, tangent); - float tangentAmount = keyframeProgress * length; - point.set(pos[0] + tangent[0] * tangentAmount, pos[1] + tangent[1] * tangentAmount); - } else if (keyframeProgress > 1) { - pathMeasure.getPosTan(length, pos, tangent); - float tangentAmount = (keyframeProgress - 1) * length; - point.set(pos[0] + tangent[0] * tangentAmount, pos[1] + tangent[1] * tangentAmount); - } else { - pathMeasure.getPosTan(keyframeProgress * length, pos, null); - point.set(pos[0], pos[1]); + float distance = keyframeProgress * length; + pathMeasure.getPosTan(distance, pos, tangent); + point.set(pos[0], pos[1]); + + if (distance < 0) { + point.offset(tangent[0] * distance, tangent[1] * distance); + } else if (distance > length) { + point.offset(tangent[0] * (distance - length), tangent[1] * (distance - length)); } return point; }