summaryrefslogtreecommitdiffstats
path: root/core/java/android/animation/PathKeyframes.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/animation/PathKeyframes.java')
-rw-r--r--core/java/android/animation/PathKeyframes.java42
1 files changed, 23 insertions, 19 deletions
diff --git a/core/java/android/animation/PathKeyframes.java b/core/java/android/animation/PathKeyframes.java
index 70eed90..2a47b68 100644
--- a/core/java/android/animation/PathKeyframes.java
+++ b/core/java/android/animation/PathKeyframes.java
@@ -17,7 +17,6 @@ package android.animation;
import android.graphics.Path;
import android.graphics.PointF;
-import android.util.MathUtils;
import java.util.ArrayList;
@@ -64,11 +63,12 @@ class PathKeyframes implements Keyframes {
@Override
public Object getValue(float fraction) {
- fraction = MathUtils.constrain(fraction, 0, 1);
-
int numPoints = mKeyframeData.length / 3;
-
- if (fraction == 0) {
+ if (fraction < 0) {
+ return interpolateInRange(fraction, 0, 1);
+ } else if (fraction > 1) {
+ return interpolateInRange(fraction, numPoints - 2, numPoints - 1);
+ } else if (fraction == 0) {
return pointForIndex(0);
} else if (fraction == 1) {
return pointForIndex(numPoints - 1);
@@ -91,25 +91,29 @@ class PathKeyframes implements Keyframes {
}
// now high is below the fraction and low is above the fraction
- int startBase = (high * NUM_COMPONENTS);
- int endBase = (low * NUM_COMPONENTS);
+ return interpolateInRange(fraction, high, low);
+ }
+ }
- float startFraction = mKeyframeData[startBase + FRACTION_OFFSET];
- float endFraction = mKeyframeData[endBase + FRACTION_OFFSET];
+ private PointF interpolateInRange(float fraction, int startIndex, int endIndex) {
+ int startBase = (startIndex * NUM_COMPONENTS);
+ int endBase = (endIndex * NUM_COMPONENTS);
- float intervalFraction = (fraction - startFraction)/(endFraction - startFraction);
+ float startFraction = mKeyframeData[startBase + FRACTION_OFFSET];
+ float endFraction = mKeyframeData[endBase + FRACTION_OFFSET];
- float startX = mKeyframeData[startBase + X_OFFSET];
- float endX = mKeyframeData[endBase + X_OFFSET];
- float startY = mKeyframeData[startBase + Y_OFFSET];
- float endY = mKeyframeData[endBase + Y_OFFSET];
+ float intervalFraction = (fraction - startFraction)/(endFraction - startFraction);
- float x = interpolate(intervalFraction, startX, endX);
- float y = interpolate(intervalFraction, startY, endY);
+ float startX = mKeyframeData[startBase + X_OFFSET];
+ float endX = mKeyframeData[endBase + X_OFFSET];
+ float startY = mKeyframeData[startBase + Y_OFFSET];
+ float endY = mKeyframeData[endBase + Y_OFFSET];
- mTempPointF.set(x, y);
- return mTempPointF;
- }
+ float x = interpolate(intervalFraction, startX, endX);
+ float y = interpolate(intervalFraction, startY, endY);
+
+ mTempPointF.set(x, y);
+ return mTempPointF;
}
@Override