summaryrefslogtreecommitdiffstats
path: root/core/java/android/animation/KeyframeSet.java
diff options
context:
space:
mode:
authorChet Haase <chet@google.com>2010-10-06 09:46:45 -0700
committerChet Haase <chet@google.com>2010-11-01 10:19:44 -0700
commit70d4ba15b1f0c1133c5aabc86de828b41e482fff (patch)
tree461f6a3acfc3b924d6c4e5902ed80e569123d349 /core/java/android/animation/KeyframeSet.java
parent6b21cdeb5f0127862d82f24a4b6001f495e3c8cd (diff)
downloadframeworks_base-70d4ba15b1f0c1133c5aabc86de828b41e482fff.zip
frameworks_base-70d4ba15b1f0c1133c5aabc86de828b41e482fff.tar.gz
frameworks_base-70d4ba15b1f0c1133c5aabc86de828b41e482fff.tar.bz2
Performance optimizations for animations and toolkit
Change-Id: I316a48273a9cbb428a965e4b849b3e5e9e8202f1
Diffstat (limited to 'core/java/android/animation/KeyframeSet.java')
-rw-r--r--core/java/android/animation/KeyframeSet.java49
1 files changed, 32 insertions, 17 deletions
diff --git a/core/java/android/animation/KeyframeSet.java b/core/java/android/animation/KeyframeSet.java
index 1741e60..2242462 100644
--- a/core/java/android/animation/KeyframeSet.java
+++ b/core/java/android/animation/KeyframeSet.java
@@ -28,12 +28,18 @@ class KeyframeSet {
private int mNumKeyframes;
- ArrayList<Keyframe> mKeyframes;
+ Keyframe mFirstKeyframe;
+ Keyframe mLastKeyframe;
+ TimeInterpolator mInterpolator; // only used in the 2-keyframe case
+ ArrayList<Keyframe> mKeyframes; // only used when there are not 2 keyframes
public KeyframeSet(Keyframe... keyframes) {
+ mNumKeyframes = keyframes.length;
mKeyframes = new ArrayList<Keyframe>();
mKeyframes.addAll(Arrays.asList(keyframes));
- mNumKeyframes = mKeyframes.size();
+ mFirstKeyframe = mKeyframes.get(0);
+ mLastKeyframe = mKeyframes.get(mNumKeyframes - 1);
+ mInterpolator = mLastKeyframe.getInterpolator();
}
public static KeyframeSet ofInt(int... values) {
@@ -125,32 +131,40 @@ class KeyframeSet {
* @return The animated value.
*/
public Object getValue(float fraction, TypeEvaluator evaluator) {
- // TODO: special-case 2-keyframe common case
+
+ // Special-case optimization for the common case of only two keyframes
+ if (mNumKeyframes == 2) {
+ if (mInterpolator != null) {
+ fraction = mInterpolator.getInterpolation(fraction);
+ }
+ return evaluator.evaluate(fraction, mFirstKeyframe.getValue(),
+ mLastKeyframe.getValue());
+ }
if (fraction <= 0f) {
- final Keyframe prevKeyframe = mKeyframes.get(0);
final Keyframe nextKeyframe = mKeyframes.get(1);
final TimeInterpolator interpolator = nextKeyframe.getInterpolator();
if (interpolator != null) {
fraction = interpolator.getInterpolation(fraction);
}
- float intervalFraction = (fraction - prevKeyframe.getFraction()) /
- (nextKeyframe.getFraction() - prevKeyframe.getFraction());
- return evaluator.evaluate(intervalFraction, prevKeyframe.getValue(),
+ final float prevFraction = mFirstKeyframe.getFraction();
+ float intervalFraction = (fraction - prevFraction) /
+ (nextKeyframe.getFraction() - prevFraction);
+ return evaluator.evaluate(intervalFraction, mFirstKeyframe.getValue(),
nextKeyframe.getValue());
} else if (fraction >= 1f) {
final Keyframe prevKeyframe = mKeyframes.get(mNumKeyframes - 2);
- final Keyframe nextKeyframe = mKeyframes.get(mNumKeyframes - 1);
- final TimeInterpolator interpolator = nextKeyframe.getInterpolator();
+ final TimeInterpolator interpolator = mLastKeyframe.getInterpolator();
if (interpolator != null) {
fraction = interpolator.getInterpolation(fraction);
}
- float intervalFraction = (fraction - prevKeyframe.getFraction()) /
- (nextKeyframe.getFraction() - prevKeyframe.getFraction());
+ final float prevFraction = prevKeyframe.getFraction();
+ float intervalFraction = (fraction - prevFraction) /
+ (mLastKeyframe.getFraction() - prevFraction);
return evaluator.evaluate(intervalFraction, prevKeyframe.getValue(),
- nextKeyframe.getValue());
+ mLastKeyframe.getValue());
}
- Keyframe prevKeyframe = mKeyframes.get(0);
+ Keyframe prevKeyframe = mFirstKeyframe;
for (int i = 1; i < mNumKeyframes; ++i) {
Keyframe nextKeyframe = mKeyframes.get(i);
if (fraction < nextKeyframe.getFraction()) {
@@ -158,14 +172,15 @@ class KeyframeSet {
if (interpolator != null) {
fraction = interpolator.getInterpolation(fraction);
}
- float intervalFraction = (fraction - prevKeyframe.getFraction()) /
- (nextKeyframe.getFraction() - prevKeyframe.getFraction());
+ final float prevFraction = prevKeyframe.getFraction();
+ float intervalFraction = (fraction - prevFraction) /
+ (nextKeyframe.getFraction() - prevFraction);
return evaluator.evaluate(intervalFraction, prevKeyframe.getValue(),
nextKeyframe.getValue());
}
prevKeyframe = nextKeyframe;
}
- // shouldn't get here
- return mKeyframes.get(mNumKeyframes - 1).getValue();
+ // shouldn't reach here
+ return mLastKeyframe.getValue();
}
}