blob: f1e146e00cf5b910d58b0421288ffe2755d1d6ea [file] [log] [blame]
Chet Haase7c608f22010-10-22 17:54:04 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.animation;
18
19import android.animation.Keyframe.IntKeyframe;
20
Yigit Boyard422dc32014-09-25 12:23:35 -070021import java.util.List;
Chet Haase7c608f22010-10-22 17:54:04 -070022
23/**
24 * This class holds a collection of IntKeyframe objects and is called by ValueAnimator to calculate
25 * values between those keyframes for a given animation. The class internal to the animation
26 * package because it is an implementation detail of how Keyframes are stored and used.
27 *
Chet Haaseb2ab04f2011-01-16 11:03:22 -080028 * <p>This type-specific subclass of KeyframeSet, along with the other type-specific subclass for
29 * float, exists to speed up the getValue() method when there is no custom
Chet Haase7c608f22010-10-22 17:54:04 -070030 * TypeEvaluator set for the animation, so that values can be calculated without autoboxing to the
31 * Object equivalents of these primitive types.</p>
32 */
George Mount984011f2014-08-21 14:28:01 -070033class IntKeyframeSet extends KeyframeSet implements Keyframes.IntKeyframes {
Chet Haase7c608f22010-10-22 17:54:04 -070034 public IntKeyframeSet(IntKeyframe... keyframes) {
35 super(keyframes);
36 }
37
38 @Override
39 public Object getValue(float fraction) {
40 return getIntValue(fraction);
41 }
42
43 @Override
44 public IntKeyframeSet clone() {
Yigit Boyard422dc32014-09-25 12:23:35 -070045 List<Keyframe> keyframes = mKeyframes;
Chet Haase7c608f22010-10-22 17:54:04 -070046 int numKeyframes = mKeyframes.size();
47 IntKeyframe[] newKeyframes = new IntKeyframe[numKeyframes];
48 for (int i = 0; i < numKeyframes; ++i) {
49 newKeyframes[i] = (IntKeyframe) keyframes.get(i).clone();
50 }
51 IntKeyframeSet newSet = new IntKeyframeSet(newKeyframes);
52 return newSet;
53 }
54
Yigit Boyar8619f482014-07-15 17:28:07 -070055 @Override
Chet Haase7c608f22010-10-22 17:54:04 -070056 public int getIntValue(float fraction) {
Chet Haase7c608f22010-10-22 17:54:04 -070057 if (fraction <= 0f) {
58 final IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(0);
59 final IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(1);
60 int prevValue = prevKeyframe.getIntValue();
61 int nextValue = nextKeyframe.getIntValue();
62 float prevFraction = prevKeyframe.getFraction();
63 float nextFraction = nextKeyframe.getFraction();
64 final TimeInterpolator interpolator = nextKeyframe.getInterpolator();
65 if (interpolator != null) {
66 fraction = interpolator.getInterpolation(fraction);
67 }
68 float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction);
69 return mEvaluator == null ?
Chet Haase750e12e2011-02-11 15:21:35 -080070 prevValue + (int)(intervalFraction * (nextValue - prevValue)) :
Chet Haase7c608f22010-10-22 17:54:04 -070071 ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)).
72 intValue();
73 } else if (fraction >= 1f) {
74 final IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(mNumKeyframes - 2);
75 final IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(mNumKeyframes - 1);
76 int prevValue = prevKeyframe.getIntValue();
77 int nextValue = nextKeyframe.getIntValue();
78 float prevFraction = prevKeyframe.getFraction();
79 float nextFraction = nextKeyframe.getFraction();
80 final TimeInterpolator interpolator = nextKeyframe.getInterpolator();
81 if (interpolator != null) {
82 fraction = interpolator.getInterpolation(fraction);
83 }
84 float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction);
85 return mEvaluator == null ?
Chet Haase750e12e2011-02-11 15:21:35 -080086 prevValue + (int)(intervalFraction * (nextValue - prevValue)) :
Chet Haase7c608f22010-10-22 17:54:04 -070087 ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)).intValue();
88 }
89 IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(0);
90 for (int i = 1; i < mNumKeyframes; ++i) {
91 IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(i);
92 if (fraction < nextKeyframe.getFraction()) {
93 final TimeInterpolator interpolator = nextKeyframe.getInterpolator();
Chet Haase7c608f22010-10-22 17:54:04 -070094 float intervalFraction = (fraction - prevKeyframe.getFraction()) /
95 (nextKeyframe.getFraction() - prevKeyframe.getFraction());
96 int prevValue = prevKeyframe.getIntValue();
97 int nextValue = nextKeyframe.getIntValue();
Doris Liu6df99052015-03-30 16:03:59 -070098 // Apply interpolator on the proportional duration.
99 if (interpolator != null) {
100 intervalFraction = interpolator.getInterpolation(intervalFraction);
101 }
Chet Haase7c608f22010-10-22 17:54:04 -0700102 return mEvaluator == null ?
Chet Haase750e12e2011-02-11 15:21:35 -0800103 prevValue + (int)(intervalFraction * (nextValue - prevValue)) :
Chet Haase7c608f22010-10-22 17:54:04 -0700104 ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)).
105 intValue();
106 }
107 prevKeyframe = nextKeyframe;
108 }
109 // shouldn't get here
110 return ((Number)mKeyframes.get(mNumKeyframes - 1).getValue()).intValue();
111 }
112
George Mount984011f2014-08-21 14:28:01 -0700113 @Override
114 public Class getType() {
115 return Integer.class;
116 }
Chet Haase7c608f22010-10-22 17:54:04 -0700117}
118