blob: 0372cb0d9cbe777024f8f3205aca8b7bbb49ca7b [file] [log] [blame]
Chet Haase17fb4b02010-06-28 17:55:07 -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.util.Log;
Chet Haaseb39f0512011-05-24 14:36:40 -070020import android.util.Property;
Chet Haase17fb4b02010-06-28 17:55:07 -070021
Chet Haase17fb4b02010-06-28 17:55:07 -070022import java.lang.reflect.Method;
Chet Haasee2ab7cc2010-12-06 16:10:07 -080023import java.util.ArrayList;
Chet Haase17fb4b02010-06-28 17:55:07 -070024
25/**
Chet Haasea18a86b2010-09-07 13:20:00 -070026 * This subclass of {@link ValueAnimator} provides support for animating properties on target objects.
Chet Haase17fb4b02010-06-28 17:55:07 -070027 * The constructors of this class take parameters to define the target object that will be animated
28 * as well as the name of the property that will be animated. Appropriate set/get functions
29 * are then determined internally and the animation will call these functions as necessary to
30 * animate the property.
Chet Haase6e0ecb42010-11-03 19:41:18 -070031 *
Joe Fernandez3aef8e1d2011-12-20 10:38:34 -080032 * <div class="special reference">
33 * <h3>Developer Guides</h3>
34 * <p>For more information about animating with {@code ObjectAnimator}, read the
35 * <a href="{@docRoot}guide/topics/graphics/prop-animation.html#object-animator">Property
36 * Animation</a> developer guide.</p>
37 * </div>
38 *
Chet Haase6e0ecb42010-11-03 19:41:18 -070039 * @see #setPropertyName(String)
40 *
Chet Haase17fb4b02010-06-28 17:55:07 -070041 */
Chet Haase2794eb32010-10-12 16:29:28 -070042public final class ObjectAnimator extends ValueAnimator {
Chet Haasee2ab7cc2010-12-06 16:10:07 -080043 private static final boolean DBG = false;
Chet Haase17fb4b02010-06-28 17:55:07 -070044
45 // The target object on which the property exists, set in the constructor
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -080046 private Object mTarget;
Chet Haase17fb4b02010-06-28 17:55:07 -070047
48 private String mPropertyName;
49
Chet Haaseb39f0512011-05-24 14:36:40 -070050 private Property mProperty;
51
Chet Haase17fb4b02010-06-28 17:55:07 -070052 /**
53 * Sets the name of the property that will be animated. This name is used to derive
54 * a setter function that will be called to set animated values.
55 * For example, a property name of <code>foo</code> will result
56 * in a call to the function <code>setFoo()</code> on the target object. If either
57 * <code>valueFrom</code> or <code>valueTo</code> is null, then a getter function will
58 * also be derived and called.
59 *
Chet Haase6e0ecb42010-11-03 19:41:18 -070060 * <p>For best performance of the mechanism that calls the setter function determined by the
61 * name of the property being animated, use <code>float</code> or <code>int</code> typed values,
62 * and make the setter function for those properties have a <code>void</code> return value. This
63 * will cause the code to take an optimized path for these constrained circumstances. Other
64 * property types and return types will work, but will have more overhead in processing
65 * the requests due to normal reflection mechanisms.</p>
66 *
Chet Haase17fb4b02010-06-28 17:55:07 -070067 * <p>Note that the setter function derived from this property name
68 * must take the same parameter type as the
69 * <code>valueFrom</code> and <code>valueTo</code> properties, otherwise the call to
70 * the setter function will fail.</p>
71 *
Chet Haasea18a86b2010-09-07 13:20:00 -070072 * <p>If this ObjectAnimator has been set up to animate several properties together,
Chet Haased953d082010-08-16 17:44:28 -070073 * using more than one PropertyValuesHolder objects, then setting the propertyName simply
74 * sets the propertyName in the first of those PropertyValuesHolder objects.</p>
75 *
Chet Haaseb39f0512011-05-24 14:36:40 -070076 * @param propertyName The name of the property being animated. Should not be null.
Chet Haase17fb4b02010-06-28 17:55:07 -070077 */
78 public void setPropertyName(String propertyName) {
Chet Haase0e0590b2010-09-26 11:57:28 -070079 // mValues could be null if this is being constructed piecemeal. Just record the
80 // propertyName to be used later when setValues() is called if so.
Chet Haased953d082010-08-16 17:44:28 -070081 if (mValues != null) {
Chet Haase602e4d32010-08-16 08:57:23 -070082 PropertyValuesHolder valuesHolder = mValues[0];
83 String oldName = valuesHolder.getPropertyName();
Chet Haased953d082010-08-16 17:44:28 -070084 valuesHolder.setPropertyName(propertyName);
Chet Haase602e4d32010-08-16 08:57:23 -070085 mValuesMap.remove(oldName);
86 mValuesMap.put(propertyName, valuesHolder);
Chet Haased953d082010-08-16 17:44:28 -070087 }
Chet Haase17fb4b02010-06-28 17:55:07 -070088 mPropertyName = propertyName;
Chet Haase0e0590b2010-09-26 11:57:28 -070089 // New property/values/target should cause re-initialization prior to starting
90 mInitialized = false;
Chet Haase17fb4b02010-06-28 17:55:07 -070091 }
92
93 /**
Chet Haaseb39f0512011-05-24 14:36:40 -070094 * Sets the property that will be animated. Property objects will take precedence over
95 * properties specified by the {@link #setPropertyName(String)} method. Animations should
96 * be set up to use one or the other, not both.
97 *
98 * @param property The property being animated. Should not be null.
99 */
100 public void setProperty(Property property) {
101 // mValues could be null if this is being constructed piecemeal. Just record the
102 // propertyName to be used later when setValues() is called if so.
103 if (mValues != null) {
104 PropertyValuesHolder valuesHolder = mValues[0];
105 String oldName = valuesHolder.getPropertyName();
106 valuesHolder.setProperty(property);
107 mValuesMap.remove(oldName);
108 mValuesMap.put(mPropertyName, valuesHolder);
109 }
110 if (mProperty != null) {
111 mPropertyName = property.getName();
112 }
113 mProperty = property;
114 // New property/values/target should cause re-initialization prior to starting
115 mInitialized = false;
116 }
117
118 /**
Chet Haase17fb4b02010-06-28 17:55:07 -0700119 * Gets the name of the property that will be animated. This name will be used to derive
120 * a setter function that will be called to set animated values.
121 * For example, a property name of <code>foo</code> will result
122 * in a call to the function <code>setFoo()</code> on the target object. If either
123 * <code>valueFrom</code> or <code>valueTo</code> is null, then a getter function will
124 * also be derived and called.
125 */
126 public String getPropertyName() {
127 return mPropertyName;
128 }
129
130 /**
Chet Haasea18a86b2010-09-07 13:20:00 -0700131 * Creates a new ObjectAnimator object. This default constructor is primarily for
Chet Haased51d3682010-08-11 19:46:48 -0700132 * use internally; the other constructors which take parameters are more generally
133 * useful.
134 */
Chet Haasea18a86b2010-09-07 13:20:00 -0700135 public ObjectAnimator() {
Chet Haased51d3682010-08-11 19:46:48 -0700136 }
137
138 /**
Chet Haaseb39f0512011-05-24 14:36:40 -0700139 * Private utility constructor that initializes the target object and name of the
140 * property being animated.
Chet Haase17fb4b02010-06-28 17:55:07 -0700141 *
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800142 * @param target The object whose property is to be animated. This object should
143 * have a public method on it called <code>setName()</code>, where <code>name</code> is
144 * the value of the <code>propertyName</code> parameter.
Chet Haased953d082010-08-16 17:44:28 -0700145 * @param propertyName The name of the property being animated.
Chet Haase17fb4b02010-06-28 17:55:07 -0700146 */
Chet Haase2794eb32010-10-12 16:29:28 -0700147 private ObjectAnimator(Object target, String propertyName) {
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800148 mTarget = target;
Chet Haased953d082010-08-16 17:44:28 -0700149 setPropertyName(propertyName);
Chet Haase17fb4b02010-06-28 17:55:07 -0700150 }
151
152 /**
Chet Haaseb39f0512011-05-24 14:36:40 -0700153 * Private utility constructor that initializes the target object and property being animated.
154 *
155 * @param target The object whose property is to be animated.
156 * @param property The property being animated.
157 */
158 private <T> ObjectAnimator(T target, Property<T, ?> property) {
159 mTarget = target;
160 setProperty(property);
161 }
162
163 /**
Chet Haase2794eb32010-10-12 16:29:28 -0700164 * Constructs and returns an ObjectAnimator that animates between int values. A single
Chet Haaseb39f0512011-05-24 14:36:40 -0700165 * value implies that that value is the one being animated to. Two values imply a starting
166 * and ending values. More than two values imply a starting value, values to animate through
167 * along the way, and an ending value (these values will be distributed evenly across
168 * the duration of the animation).
Chet Haase2794eb32010-10-12 16:29:28 -0700169 *
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800170 * @param target The object whose property is to be animated. This object should
171 * have a public method on it called <code>setName()</code>, where <code>name</code> is
172 * the value of the <code>propertyName</code> parameter.
Chet Haase2794eb32010-10-12 16:29:28 -0700173 * @param propertyName The name of the property being animated.
174 * @param values A set of values that the animation will animate between over time.
Chet Haaseb39f0512011-05-24 14:36:40 -0700175 * @return An ObjectAnimator object that is set up to animate between the given values.
Chet Haase2794eb32010-10-12 16:29:28 -0700176 */
177 public static ObjectAnimator ofInt(Object target, String propertyName, int... values) {
178 ObjectAnimator anim = new ObjectAnimator(target, propertyName);
179 anim.setIntValues(values);
180 return anim;
181 }
182
183 /**
Chet Haaseb39f0512011-05-24 14:36:40 -0700184 * Constructs and returns an ObjectAnimator that animates between int values. A single
185 * value implies that that value is the one being animated to. Two values imply a starting
186 * and ending values. More than two values imply a starting value, values to animate through
187 * along the way, and an ending value (these values will be distributed evenly across
188 * the duration of the animation).
189 *
190 * @param target The object whose property is to be animated.
191 * @param property The property being animated.
192 * @param values A set of values that the animation will animate between over time.
193 * @return An ObjectAnimator object that is set up to animate between the given values.
194 */
195 public static <T> ObjectAnimator ofInt(T target, Property<T, Integer> property, int... values) {
196 ObjectAnimator anim = new ObjectAnimator(target, property);
197 anim.setIntValues(values);
198 return anim;
199 }
200
201 /**
Chet Haase2794eb32010-10-12 16:29:28 -0700202 * Constructs and returns an ObjectAnimator that animates between float values. A single
Chet Haaseb39f0512011-05-24 14:36:40 -0700203 * value implies that that value is the one being animated to. Two values imply a starting
204 * and ending values. More than two values imply a starting value, values to animate through
205 * along the way, and an ending value (these values will be distributed evenly across
206 * the duration of the animation).
Chet Haase2794eb32010-10-12 16:29:28 -0700207 *
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800208 * @param target The object whose property is to be animated. This object should
209 * have a public method on it called <code>setName()</code>, where <code>name</code> is
210 * the value of the <code>propertyName</code> parameter.
Chet Haase2794eb32010-10-12 16:29:28 -0700211 * @param propertyName The name of the property being animated.
212 * @param values A set of values that the animation will animate between over time.
Chet Haaseb39f0512011-05-24 14:36:40 -0700213 * @return An ObjectAnimator object that is set up to animate between the given values.
Chet Haase2794eb32010-10-12 16:29:28 -0700214 */
215 public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) {
216 ObjectAnimator anim = new ObjectAnimator(target, propertyName);
217 anim.setFloatValues(values);
218 return anim;
219 }
220
221 /**
Chet Haaseb39f0512011-05-24 14:36:40 -0700222 * Constructs and returns an ObjectAnimator that animates between float values. A single
223 * value implies that that value is the one being animated to. Two values imply a starting
224 * and ending values. More than two values imply a starting value, values to animate through
225 * along the way, and an ending value (these values will be distributed evenly across
226 * the duration of the animation).
227 *
228 * @param target The object whose property is to be animated.
229 * @param property The property being animated.
230 * @param values A set of values that the animation will animate between over time.
231 * @return An ObjectAnimator object that is set up to animate between the given values.
232 */
233 public static <T> ObjectAnimator ofFloat(T target, Property<T, Float> property,
234 float... values) {
235 ObjectAnimator anim = new ObjectAnimator(target, property);
236 anim.setFloatValues(values);
237 return anim;
238 }
239
240 /**
241 * Constructs and returns an ObjectAnimator that animates between Object values. A single
242 * value implies that that value is the one being animated to. Two values imply a starting
243 * and ending values. More than two values imply a starting value, values to animate through
244 * along the way, and an ending value (these values will be distributed evenly across
245 * the duration of the animation).
Chet Haasefe591562010-07-27 11:15:37 -0700246 *
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800247 * @param target The object whose property is to be animated. This object should
Chet Haaseb39f0512011-05-24 14:36:40 -0700248 * have a public method on it called <code>setName()</code>, where <code>name</code> is
249 * the value of the <code>propertyName</code> parameter.
Chet Haase2794eb32010-10-12 16:29:28 -0700250 * @param propertyName The name of the property being animated.
251 * @param evaluator A TypeEvaluator that will be called on each animation frame to
Chet Haaseb39f0512011-05-24 14:36:40 -0700252 * provide the necessary interpolation between the Object values to derive the animated
Chet Haase2794eb32010-10-12 16:29:28 -0700253 * value.
Chet Haaseb39f0512011-05-24 14:36:40 -0700254 * @param values A set of values that the animation will animate between over time.
255 * @return An ObjectAnimator object that is set up to animate between the given values.
Chet Haasefe591562010-07-27 11:15:37 -0700256 */
Chet Haase2794eb32010-10-12 16:29:28 -0700257 public static ObjectAnimator ofObject(Object target, String propertyName,
258 TypeEvaluator evaluator, Object... values) {
259 ObjectAnimator anim = new ObjectAnimator(target, propertyName);
260 anim.setObjectValues(values);
261 anim.setEvaluator(evaluator);
262 return anim;
263 }
264
265 /**
Chet Haaseb39f0512011-05-24 14:36:40 -0700266 * Constructs and returns an ObjectAnimator that animates between Object values. A single
267 * value implies that that value is the one being animated to. Two values imply a starting
268 * and ending values. More than two values imply a starting value, values to animate through
269 * along the way, and an ending value (these values will be distributed evenly across
270 * the duration of the animation).
Chet Haase2794eb32010-10-12 16:29:28 -0700271 *
Chet Haaseb39f0512011-05-24 14:36:40 -0700272 * @param target The object whose property is to be animated.
273 * @param property The property being animated.
274 * @param evaluator A TypeEvaluator that will be called on each animation frame to
275 * provide the necessary interpolation between the Object values to derive the animated
276 * value.
277 * @param values A set of values that the animation will animate between over time.
278 * @return An ObjectAnimator object that is set up to animate between the given values.
279 */
280 public static <T, V> ObjectAnimator ofObject(T target, Property<T, V> property,
281 TypeEvaluator<V> evaluator, V... values) {
282 ObjectAnimator anim = new ObjectAnimator(target, property);
283 anim.setObjectValues(values);
284 anim.setEvaluator(evaluator);
285 return anim;
286 }
287
288 /**
289 * Constructs and returns an ObjectAnimator that animates between the sets of values specified
290 * in <code>PropertyValueHolder</code> objects. This variant should be used when animating
291 * several properties at once with the same ObjectAnimator, since PropertyValuesHolder allows
292 * you to associate a set of animation values with a property name.
293 *
294 * @param target The object whose property is to be animated. Depending on how the
295 * PropertyValuesObjects were constructed, the target object should either have the {@link
296 * android.util.Property} objects used to construct the PropertyValuesHolder objects or (if the
297 * PropertyValuesHOlder objects were created with property names) the target object should have
298 * public methods on it called <code>setName()</code>, where <code>name</code> is the name of
299 * the property passed in as the <code>propertyName</code> parameter for each of the
300 * PropertyValuesHolder objects.
301 * @param values A set of PropertyValuesHolder objects whose values will be animated between
302 * over time.
303 * @return An ObjectAnimator object that is set up to animate between the given values.
Chet Haase2794eb32010-10-12 16:29:28 -0700304 */
305 public static ObjectAnimator ofPropertyValuesHolder(Object target,
306 PropertyValuesHolder... values) {
307 ObjectAnimator anim = new ObjectAnimator();
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800308 anim.mTarget = target;
Chet Haase2794eb32010-10-12 16:29:28 -0700309 anim.setValues(values);
310 return anim;
Chet Haase3dd207a2010-07-20 14:00:01 -0700311 }
312
Romain Guy83d6e822010-10-14 10:13:53 -0700313 @Override
Chet Haase2794eb32010-10-12 16:29:28 -0700314 public void setIntValues(int... values) {
Romain Guy83d6e822010-10-14 10:13:53 -0700315 if (mValues == null || mValues.length == 0) {
316 // No values yet - this animator is being constructed piecemeal. Init the values with
317 // whatever the current propertyName is
Chet Haaseb39f0512011-05-24 14:36:40 -0700318 if (mProperty != null) {
319 setValues(PropertyValuesHolder.ofInt(mProperty, values));
320 } else {
321 setValues(PropertyValuesHolder.ofInt(mPropertyName, values));
322 }
Romain Guy83d6e822010-10-14 10:13:53 -0700323 } else {
Chet Haase2794eb32010-10-12 16:29:28 -0700324 super.setIntValues(values);
325 }
326 }
327
328 @Override
329 public void setFloatValues(float... values) {
330 if (mValues == null || mValues.length == 0) {
331 // No values yet - this animator is being constructed piecemeal. Init the values with
332 // whatever the current propertyName is
Chet Haaseb39f0512011-05-24 14:36:40 -0700333 if (mProperty != null) {
334 setValues(PropertyValuesHolder.ofFloat(mProperty, values));
335 } else {
336 setValues(PropertyValuesHolder.ofFloat(mPropertyName, values));
337 }
Chet Haase2794eb32010-10-12 16:29:28 -0700338 } else {
339 super.setFloatValues(values);
340 }
341 }
342
343 @Override
Chet Haase2794eb32010-10-12 16:29:28 -0700344 public void setObjectValues(Object... values) {
345 if (mValues == null || mValues.length == 0) {
346 // No values yet - this animator is being constructed piecemeal. Init the values with
347 // whatever the current propertyName is
Chet Haaseb39f0512011-05-24 14:36:40 -0700348 if (mProperty != null) {
349 setValues(PropertyValuesHolder.ofObject(mProperty, (TypeEvaluator)null, values));
350 } else {
351 setValues(PropertyValuesHolder.ofObject(mPropertyName, (TypeEvaluator)null, values));
352 }
Chet Haase2794eb32010-10-12 16:29:28 -0700353 } else {
354 super.setObjectValues(values);
Romain Guy83d6e822010-10-14 10:13:53 -0700355 }
Chet Haase0e0590b2010-09-26 11:57:28 -0700356 }
Romain Guy83d6e822010-10-14 10:13:53 -0700357
Chet Haasee2ab7cc2010-12-06 16:10:07 -0800358 @Override
359 public void start() {
360 if (DBG) {
Chet Haase3c4ce722011-09-02 15:37:25 -0700361 Log.d("ObjectAnimator", "Anim target, duration: " + mTarget + ", " + getDuration());
Chet Haasee2ab7cc2010-12-06 16:10:07 -0800362 for (int i = 0; i < mValues.length; ++i) {
363 PropertyValuesHolder pvh = mValues[i];
364 ArrayList<Keyframe> keyframes = pvh.mKeyframeSet.mKeyframes;
365 Log.d("ObjectAnimator", " Values[" + i + "]: " +
366 pvh.getPropertyName() + ", " + keyframes.get(0).getValue() + ", " +
367 keyframes.get(pvh.mKeyframeSet.mNumKeyframes - 1).getValue());
368 }
369 }
370 super.start();
371 }
372
Chet Haase3dd207a2010-07-20 14:00:01 -0700373 /**
Chet Haase17fb4b02010-06-28 17:55:07 -0700374 * This function is called immediately before processing the first animation
375 * frame of an animation. If there is a nonzero <code>startDelay</code>, the
376 * function is called after that delay ends.
377 * It takes care of the final initialization steps for the
378 * animation. This includes setting mEvaluator, if the user has not yet
379 * set it up, and the setter/getter methods, if the user did not supply
380 * them.
381 *
382 * <p>Overriders of this method should call the superclass method to cause
383 * internal mechanisms to be set up correctly.</p>
384 */
385 @Override
386 void initAnimation() {
Chet Haase21cd1382010-09-01 17:42:29 -0700387 if (!mInitialized) {
388 // mValueType may change due to setter/getter setup; do this before calling super.init(),
389 // which uses mValueType to set up the default type evaluator.
390 int numValues = mValues.length;
391 for (int i = 0; i < numValues; ++i) {
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800392 mValues[i].setupSetterAndGetter(mTarget);
Chet Haase21cd1382010-09-01 17:42:29 -0700393 }
394 super.initAnimation();
Chet Haase17fb4b02010-06-28 17:55:07 -0700395 }
396 }
397
Chet Haase2794eb32010-10-12 16:29:28 -0700398 /**
399 * Sets the length of the animation. The default duration is 300 milliseconds.
400 *
401 * @param duration The length of the animation, in milliseconds.
402 * @return ObjectAnimator The object called with setDuration(). This return
403 * value makes it easier to compose statements together that construct and then set the
404 * duration, as in
405 * <code>ObjectAnimator.ofInt(target, propertyName, 0, 10).setDuration(500).start()</code>.
406 */
407 @Override
408 public ObjectAnimator setDuration(long duration) {
409 super.setDuration(duration);
410 return this;
411 }
412
Chet Haase17fb4b02010-06-28 17:55:07 -0700413
414 /**
415 * The target object whose property will be animated by this animation
416 *
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800417 * @return The object being animated
Chet Haase17fb4b02010-06-28 17:55:07 -0700418 */
419 public Object getTarget() {
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800420 return mTarget;
Chet Haase17fb4b02010-06-28 17:55:07 -0700421 }
422
423 /**
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800424 * Sets the target object whose property will be animated by this animation
Chet Haasef54a8d72010-07-22 14:44:59 -0700425 *
426 * @param target The object being animated
427 */
Chet Haase21cd1382010-09-01 17:42:29 -0700428 @Override
Chet Haasef54a8d72010-07-22 14:44:59 -0700429 public void setTarget(Object target) {
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800430 if (mTarget != target) {
Patrick Dubroy7beecfa2011-01-16 14:42:39 -0800431 final Object oldTarget = mTarget;
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800432 mTarget = target;
Patrick Dubroy7beecfa2011-01-16 14:42:39 -0800433 if (oldTarget != null && target != null && oldTarget.getClass() == target.getClass()) {
Chet Haase70d4ba12010-10-06 09:46:45 -0700434 return;
435 }
436 // New target type should cause re-initialization prior to starting
437 mInitialized = false;
438 }
Chet Haasef54a8d72010-07-22 14:44:59 -0700439 }
440
Chet Haase21cd1382010-09-01 17:42:29 -0700441 @Override
442 public void setupStartValues() {
443 initAnimation();
444 int numValues = mValues.length;
445 for (int i = 0; i < numValues; ++i) {
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800446 mValues[i].setupStartValue(mTarget);
Chet Haase21cd1382010-09-01 17:42:29 -0700447 }
448 }
449
450 @Override
451 public void setupEndValues() {
452 initAnimation();
453 int numValues = mValues.length;
454 for (int i = 0; i < numValues; ++i) {
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800455 mValues[i].setupEndValue(mTarget);
Chet Haase21cd1382010-09-01 17:42:29 -0700456 }
457 }
458
Chet Haasef54a8d72010-07-22 14:44:59 -0700459 /**
Chet Haase17fb4b02010-06-28 17:55:07 -0700460 * This method is called with the elapsed fraction of the animation during every
461 * animation frame. This function turns the elapsed fraction into an interpolated fraction
462 * and then into an animated value (from the evaluator. The function is called mostly during
463 * animation updates, but it is also called when the <code>end()</code>
464 * function is called, to set the final value on the property.
465 *
466 * <p>Overrides of this method must call the superclass to perform the calculation
467 * of the animated value.</p>
468 *
469 * @param fraction The elapsed fraction of the animation.
470 */
471 @Override
472 void animateValue(float fraction) {
473 super.animateValue(fraction);
Chet Haase602e4d32010-08-16 08:57:23 -0700474 int numValues = mValues.length;
475 for (int i = 0; i < numValues; ++i) {
Patrick Dubroy51ae5fc2011-01-16 14:23:15 -0800476 mValues[i].setAnimatedValue(mTarget);
Chet Haase17fb4b02010-06-28 17:55:07 -0700477 }
478 }
Chet Haase49afa5b2010-08-23 11:39:53 -0700479
480 @Override
Chet Haasea18a86b2010-09-07 13:20:00 -0700481 public ObjectAnimator clone() {
482 final ObjectAnimator anim = (ObjectAnimator) super.clone();
Chet Haase49afa5b2010-08-23 11:39:53 -0700483 return anim;
484 }
Chet Haasee9140a72011-02-16 16:23:29 -0800485
486 @Override
487 public String toString() {
488 String returnVal = "ObjectAnimator@" + Integer.toHexString(hashCode()) + ", target " +
489 mTarget;
490 if (mValues != null) {
491 for (int i = 0; i < mValues.length; ++i) {
492 returnVal += "\n " + mValues[i].toString();
493 }
494 }
495 return returnVal;
496 }
Chet Haase17fb4b02010-06-28 17:55:07 -0700497}