summaryrefslogtreecommitdiffstats
path: root/core/java/android/animation/PathKeyframes.java
diff options
context:
space:
mode:
authorGeorge Mount <mount@google.com>2014-09-12 13:21:32 -0700
committerGeorge Mount <mount@google.com>2014-09-12 15:46:02 -0700
commitbc68f5adc222e6438588537fba222ea6a13f46e0 (patch)
treefbfaafec365937b5024a5c499def0c95addda88c /core/java/android/animation/PathKeyframes.java
parent04c9d29bf3d8c1107e35e3f9c73439e97255a9ef (diff)
downloadframeworks_base-bc68f5adc222e6438588537fba222ea6a13f46e0.zip
frameworks_base-bc68f5adc222e6438588537fba222ea6a13f46e0.tar.gz
frameworks_base-bc68f5adc222e6438588537fba222ea6a13f46e0.tar.bz2
Allow Path Animations to support overshooting.
Bug 17458698 Change-Id: I7a29fc8932a28121d7db8b3bf695d91a55ef059b
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