19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view.animation;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1980756e38882720860db52f1fcc21fa1505a02abfTor Norbyeimport android.annotation.ColorInt;
20417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbyeimport android.annotation.InterpolatorRes;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
23877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstromimport android.graphics.RectF;
24393a52c9f628bbf2ab68508913177650f9183ee4Romain Guyimport android.os.Handler;
25877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstromimport android.os.SystemProperties;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue;
28877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstromimport dalvik.system.CloseGuard;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Abstraction for an Animation that can be applied to Views, Surfaces, or
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * other objects. See the {@link android.view.animation animation package
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * description file}.
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class Animation implements Cloneable {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Repeat the animation indefinitely.
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int INFINITE = -1;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When the animation reaches the end and the repeat count is INFINTE_REPEAT
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or a positive value, the animation restarts from the beginning.
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RESTART = 1;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When the animation reaches the end and the repeat count is INFINTE_REPEAT
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or a positive value, the animation plays backward (and then forward again).
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int REVERSE = 2;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Can be used as the start time to indicate the start time should be the current
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time when {@link #getTransformation(long, Transformation)} is invoked for the
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * first animation frame. This can is useful for short animations.
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int START_ON_FIRST_FRAME = -1;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The specified dimension is an absolute number of pixels.
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ABSOLUTE = 0;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The specified dimension holds a float and should be multiplied by the
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * height or width of the object being animated.
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RELATIVE_TO_SELF = 1;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The specified dimension holds a float and should be multiplied by the
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * height or width of the parent of the object being animated.
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RELATIVE_TO_PARENT = 2;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Requests that the content being animated be kept in its current Z
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * order.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ZORDER_NORMAL = 0;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Requests that the content being animated be forced on top of all other
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * content for the duration of the animation.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ZORDER_TOP = 1;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Requests that the content being animated be forced under all other
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * content for the duration of the animation.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ZORDER_BOTTOM = -1;
94877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom
95877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom    private static final boolean USE_CLOSEGUARD
96877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom            = SystemProperties.getBoolean("log.closeguard.Animation", false);
97877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set by {@link #getTransformation(long, Transformation)} when the animation ends.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mEnded = false;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set by {@link #getTransformation(long, Transformation)} when the animation starts.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mStarted = false;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set by {@link #getTransformation(long, Transformation)} when the animation repeats
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in REVERSE mode.
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mCycleFlip = false;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This value must be set to true by {@link #initialize(int, int, int, int)}. It
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * indicates the animation was successfully initialized and can be played.
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mInitialized = false;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether the animation transformation should be applied before the
122d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * animation starts. The value of this variable is only relevant if mFillEnabled is true;
123d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * otherwise it is assumed to be true.
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFillBefore = true;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether the animation transformation should be applied after the
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * animation ends.
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFillAfter = false;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
134d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * Indicates whether fillBefore should be taken into account.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFillEnabled = false;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The time in milliseconds at which the animation must start;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mStartTime = -1;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The delay in milliseconds after which the animation must start. When the
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * start offset is > 0, the start time of the animation is startTime + startOffset.
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mStartOffset;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The duration of one animation cycle in milliseconds.
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mDuration;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The number of times the animation must repeat. By default, an animation repeats
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * indefinitely.
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mRepeatCount = 0;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates how many times the animation was repeated.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mRepeated = 0;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The behavior of the animation when it repeats. The repeat mode is either
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #RESTART} or {@link #REVERSE}.
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mRepeatMode = RESTART;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The interpolator used by the animation to smooth the movement.
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Interpolator mInterpolator;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The animation listener to be notified when the animation starts, ends or repeats.
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AnimationListener mListener;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Desired Z order mode during animation.
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mZAdjustment;
1864846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase
1874846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase    /**
188de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     * Desired background color behind animation.
189de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     */
190de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    private int mBackgroundColor;
191de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn
192de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    /**
1934846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     * scalefactor to apply to pivot points, etc. during animation. Subclasses retrieve the
1944846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     * value via getScaleFactor().
1954846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     */
1964846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase    private float mScaleFactor = 1f;
1974846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase
1989db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru    /**
1999db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru     * Don't animate the wallpaper.
2009db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru     */
2019db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru    private boolean mDetachWallpaper = false;
2029db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mMore = true;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mOneMoreTime = true;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    RectF mPreviousRegion = new RectF();
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    RectF mRegion = new RectF();
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Transformation mTransformation = new Transformation();
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Transformation mPreviousTransformation = new Transformation();
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
211877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom    private final CloseGuard guard = CloseGuard.get();
212877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom
213393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy    private Handler mListenerHandler;
214393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy    private Runnable mOnStart;
215393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy    private Runnable mOnRepeat;
216393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy    private Runnable mOnEnd;
217393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new animation with a duration of 0ms, the default interpolator, with
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * fillBefore set to true and fillAfter set to false
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Animation() {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ensureInterpolator();
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new animation whose parameters come from the specified context and
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * attributes set.
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context the application environment
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param attrs the set of attributes holding the animation parameters
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Animation(Context context, AttributeSet attrs) {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.Animation);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setDuration((long) a.getInt(com.android.internal.R.styleable.Animation_duration, 0));
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setStartOffset((long) a.getInt(com.android.internal.R.styleable.Animation_startOffset, 0));
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFillEnabled(a.getBoolean(com.android.internal.R.styleable.Animation_fillEnabled, mFillEnabled));
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFillBefore(a.getBoolean(com.android.internal.R.styleable.Animation_fillBefore, mFillBefore));
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFillAfter(a.getBoolean(com.android.internal.R.styleable.Animation_fillAfter, mFillAfter));
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setRepeatCount(a.getInt(com.android.internal.R.styleable.Animation_repeatCount, mRepeatCount));
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setRepeatMode(a.getInt(com.android.internal.R.styleable.Animation_repeatMode, RESTART));
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setZAdjustment(a.getInt(com.android.internal.R.styleable.Animation_zAdjustment, ZORDER_NORMAL));
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
248de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn        setBackgroundColor(a.getInt(com.android.internal.R.styleable.Animation_background, 0));
249de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn
2509db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru        setDetachWallpaper(a.getBoolean(com.android.internal.R.styleable.Animation_detachWallpaper, false));
251ab0f485e64418eb22f0a1d89d7064902b381e9c2Dianne Hackborn
252ab0f485e64418eb22f0a1d89d7064902b381e9c2Dianne Hackborn        final int resID = a.getResourceId(com.android.internal.R.styleable.Animation_interpolator, 0);
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
255ab0f485e64418eb22f0a1d89d7064902b381e9c2Dianne Hackborn
256ab0f485e64418eb22f0a1d89d7064902b381e9c2Dianne Hackborn        if (resID > 0) {
257ab0f485e64418eb22f0a1d89d7064902b381e9c2Dianne Hackborn            setInterpolator(context, resID);
258ab0f485e64418eb22f0a1d89d7064902b381e9c2Dianne Hackborn        }
259ab0f485e64418eb22f0a1d89d7064902b381e9c2Dianne Hackborn
260ab0f485e64418eb22f0a1d89d7064902b381e9c2Dianne Hackborn        ensureInterpolator();
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Animation clone() throws CloneNotSupportedException {
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Animation animation = (Animation) super.clone();
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        animation.mPreviousRegion = new RectF();
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        animation.mRegion = new RectF();
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        animation.mTransformation = new Transformation();
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        animation.mPreviousTransformation = new Transformation();
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return animation;
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Reset the initialization state of this animation.
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #initialize(int, int, int, int)
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void reset() {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPreviousRegion.setEmpty();
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPreviousTransformation.clear();
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInitialized = false;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCycleFlip = false;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeated = 0;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMore = true;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOneMoreTime = true;
286393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy        mListenerHandler = null;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
290305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy     * Cancel the animation. Cancelling an animation invokes the animation
291305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy     * listener, if set, to notify the end of the animation.
292305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy     *
293305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy     * If you cancel an animation manually, you must call {@link #reset()}
294305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy     * before starting the animation again.
295305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy     *
296305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy     * @see #reset()
297305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy     * @see #start()
298305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy     * @see #startNow()
299305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy     */
300305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy    public void cancel() {
301305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy        if (mStarted && !mEnded) {
302393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy            fireAnimationEnd();
303305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy            mEnded = true;
304877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom            guard.close();
305305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy        }
306305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy        // Make sure we move the animation to the end
307305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy        mStartTime = Long.MIN_VALUE;
308305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy        mMore = mOneMoreTime = false;
309305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy    }
310305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy
311305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy    /**
312b4a107d8269d1a75b8f270e0516c1fa3b517f8f9Romain Guy     * @hide
313b4a107d8269d1a75b8f270e0516c1fa3b517f8f9Romain Guy     */
314b4a107d8269d1a75b8f270e0516c1fa3b517f8f9Romain Guy    public void detach() {
315b4a107d8269d1a75b8f270e0516c1fa3b517f8f9Romain Guy        if (mStarted && !mEnded) {
316b4a107d8269d1a75b8f270e0516c1fa3b517f8f9Romain Guy            mEnded = true;
317877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom            guard.close();
318393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy            fireAnimationEnd();
319b4a107d8269d1a75b8f270e0516c1fa3b517f8f9Romain Guy        }
320b4a107d8269d1a75b8f270e0516c1fa3b517f8f9Romain Guy    }
321b4a107d8269d1a75b8f270e0516c1fa3b517f8f9Romain Guy
322b4a107d8269d1a75b8f270e0516c1fa3b517f8f9Romain Guy    /**
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Whether or not the animation has been initialized.
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Has this animation been initialized.
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #initialize(int, int, int, int)
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isInitialized() {
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mInitialized;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initialize this animation with the dimensions of the object being
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * animated as well as the objects parents. (This is to support animation
33584c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase     * sizes being specified relative to these dimensions.)
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33749afa5bc100e5d4c069fea980dd6b09501f56397Chet Haase     * <p>Objects that interpret Animations should call this method when
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the sizes of the object being animated and its parent are known, and
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * before calling {@link #getTransformation}.
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param width Width of the object being animated
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param height Height of the object being animated
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param parentWidth Width of the animated object's parent
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param parentHeight Height of the animated object's parent
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void initialize(int width, int height, int parentWidth, int parentHeight) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        reset();
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInitialized = true;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
353393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy     * Sets the handler used to invoke listeners.
354393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy     *
355393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy     * @hide
356393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy     */
357393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy    public void setListenerHandler(Handler handler) {
358393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy        if (mListenerHandler == null) {
359393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy            mOnStart = new Runnable() {
360393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                public void run() {
361393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                    if (mListener != null) {
362393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                        mListener.onAnimationStart(Animation.this);
363393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                    }
364393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                }
365393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy            };
366393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy            mOnRepeat = new Runnable() {
367393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                public void run() {
368393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                    if (mListener != null) {
369393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                        mListener.onAnimationRepeat(Animation.this);
370393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                    }
371393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                }
372393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy            };
373393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy            mOnEnd = new Runnable() {
374393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                public void run() {
375393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                    if (mListener != null) {
376393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                        mListener.onAnimationEnd(Animation.this);
377393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                    }
378393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                }
379393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy            };
380393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy        }
381393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy        mListenerHandler = handler;
382393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy    }
383393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy
384393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy    /**
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the acceleration curve for this animation. The interpolator is loaded as
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a resource from the specified context.
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The application environment
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resID The resource identifier of the interpolator to load
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_interpolator
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
392417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye    public void setInterpolator(Context context, @InterpolatorRes int resID) {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setInterpolator(AnimationUtils.loadInterpolator(context, resID));
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the acceleration curve for this animation. Defaults to a linear
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * interpolation.
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param i The interpolator which defines the acceleration curve
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_interpolator
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setInterpolator(Interpolator i) {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInterpolator = i;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When this animation should start relative to the start time. This is most
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * useful when composing complex animations using an {@link AnimationSet }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * where some of the animations components start at different times.
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startOffset When this Animation should start, in milliseconds from
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    the start time of the root AnimationSet.
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_startOffset
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setStartOffset(long startOffset) {
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartOffset = startOffset;
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * How long this animation should last. The duration cannot be negative.
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param durationMillis Duration in milliseconds
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4259db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru     * @throws java.lang.IllegalArgumentException if the duration is < 0
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_duration
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDuration(long durationMillis) {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (durationMillis < 0) {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("Animation duration cannot be negative");
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDuration = durationMillis;
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Ensure that the duration that this animation will run is not longer
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * than <var>durationMillis</var>.  In addition to adjusting the duration
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * itself, this ensures that the repeat count also will not make it run
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * longer than the given time.
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param durationMillis The maximum duration the animation is allowed
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to run.
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void restrictDuration(long durationMillis) {
4464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        // If we start after the duration, then we just won't run.
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mStartOffset > durationMillis) {
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStartOffset = durationMillis;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDuration = 0;
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRepeatCount = 0;
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long dur = mDuration + mStartOffset;
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dur > durationMillis) {
4564df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mDuration = durationMillis-mStartOffset;
4574df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            dur = durationMillis;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4594df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        // If the duration is 0 or less, then we won't run.
4604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        if (mDuration <= 0) {
4614df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mDuration = 0;
4624df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mRepeatCount = 0;
4634df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            return;
4644df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
4654df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        // Reduce the number of repeats to keep below the maximum duration.
4664df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        // The comparison between mRepeatCount and duration is to catch
4674df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        // overflows after multiplying them.
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mRepeatCount < 0 || mRepeatCount > durationMillis
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || (dur*mRepeatCount) > durationMillis) {
4704df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            // Figure out how many times to do the animation.  Subtract 1 since
4714df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            // repeat count is the number of times to repeat so 0 runs once.
4724df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mRepeatCount = (int)(durationMillis/dur) - 1;
4734df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (mRepeatCount < 0) {
4744df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                mRepeatCount = 0;
4754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * How much to scale the duration by.
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scale The amount to scale the duration.
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void scaleCurrentDuration(float scale) {
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDuration = (long) (mDuration * scale);
486a4bacb8b74adf7908ac382024dc9183144793217Dianne Hackborn        mStartOffset = (long) (mStartOffset * scale);
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When this animation should start. When the start time is set to
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #START_ON_FIRST_FRAME}, the animation will start the first time
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getTransformation(long, Transformation)} is invoked. The time passed
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to this method should be obtained by calling
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link AnimationUtils#currentAnimationTimeMillis()} instead of
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link System#currentTimeMillis()}.
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param startTimeMillis the start time in milliseconds
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setStartTime(long startTimeMillis) {
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartTime = startTimeMillis;
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStarted = mEnded = false;
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCycleFlip = false;
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeated = 0;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMore = true;
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience method to start the animation the first time
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getTransformation(long, Transformation)} is invoked.
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void start() {
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setStartTime(-1);
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience method to start the animation at the current time in
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * milliseconds.
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startNow() {
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setStartTime(AnimationUtils.currentAnimationTimeMillis());
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines what this animation should do when it reaches the end. This
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * setting is applied only when the repeat count is either greater than
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * 0 or {@link #INFINITE}. Defaults to {@link #RESTART}.
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeatMode {@link #RESTART} or {@link #REVERSE}
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_repeatMode
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setRepeatMode(int repeatMode) {
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatMode = repeatMode;
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets how many times the animation should be repeated. If the repeat
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * count is 0, the animation is never repeated. If the repeat count is
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * greater than 0 or {@link #INFINITE}, the repeat mode will be taken
5394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * into account. The repeat count is 0 by default.
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeatCount the number of times the animation should be repeated
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_repeatCount
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setRepeatCount(int repeatCount) {
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (repeatCount < 0) {
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            repeatCount = INFINITE;
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeatCount;
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
552d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * If fillEnabled is true, this animation will apply the value of fillBefore.
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
554d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * @return true if the animation will take fillBefore into account
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_fillEnabled
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isFillEnabled() {
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFillEnabled;
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
562d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * If fillEnabled is true, the animation will apply the value of fillBefore.
563d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * Otherwise, fillBefore is ignored and the animation
564d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * transformation is always applied until the animation ends.
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
566d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * @param fillEnabled true if the animation should take the value of fillBefore into account
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_fillEnabled
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setFillBefore(boolean)
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setFillAfter(boolean)
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFillEnabled(boolean fillEnabled) {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFillEnabled = fillEnabled;
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If fillBefore is true, this animation will apply its transformation
578d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * before the start time of the animation. Defaults to true if
579d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * {@link #setFillEnabled(boolean)} is not set to true.
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that this applies when using an {@link
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * android.view.animation.AnimationSet AnimationSet} to chain
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * animations. The transformation is not applied before the AnimationSet
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * itself starts.
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fillBefore true if the animation should apply its transformation before it starts
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_fillBefore
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setFillEnabled(boolean)
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFillBefore(boolean fillBefore) {
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFillBefore = fillBefore;
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If fillAfter is true, the transformation that this animation performed
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will persist when it is finished. Defaults to false if not set.
597d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * Note that this applies to individual animations and when using an {@link
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * android.view.animation.AnimationSet AnimationSet} to chain
599d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * animations.
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fillAfter true if the animation should apply its transformation after it ends
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_fillAfter
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setFillEnabled(boolean)
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFillAfter(boolean fillAfter) {
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFillAfter = fillAfter;
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the Z ordering mode to use while running the animation.
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param zAdjustment The desired mode, one of {@link #ZORDER_NORMAL},
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ZORDER_TOP}, or {@link #ZORDER_BOTTOM}.
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_zAdjustment
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setZAdjustment(int zAdjustment) {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mZAdjustment = zAdjustment;
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
622de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     * Set background behind animation.
623de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     *
624de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     * @param bg The background color.  If 0, no background.  Currently must
625de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     * be black, with any desired alpha level.
626de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     */
62780756e38882720860db52f1fcc21fa1505a02abfTor Norbye    public void setBackgroundColor(@ColorInt int bg) {
628de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn        mBackgroundColor = bg;
629de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    }
630de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn
631de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    /**
6324846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     * The scale factor is set by the call to <code>getTransformation</code>. Overrides of
6334846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     * {@link #getTransformation(long, Transformation, float)} will get this value
6344846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     * directly. Overrides of {@link #applyTransformation(float, Transformation)} can
6354846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     * call this method to get the value.
6364846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     *
6374846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     * @return float The scale factor that should be applied to pre-scaled values in
6384846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     * an Animation such as the pivot points in {@link ScaleAnimation} and {@link RotateAnimation}.
6394846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     */
6404846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase    protected float getScaleFactor() {
6414846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase        return mScaleFactor;
6424846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase    }
6434846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase
6444846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase    /**
6459db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru     * If detachWallpaper is true, and this is a window animation of a window
6469db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru     * that has a wallpaper background, then the window will be detached from
6479db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru     * the wallpaper while it runs.  That is, the animation will only be applied
6489db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru     * to the window, and the wallpaper behind it will remain static.
6499db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru     *
6509db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru     * @param detachWallpaper true if the wallpaper should be detached from the animation
6519db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru     * @attr ref android.R.styleable#Animation_detachWallpaper
6529db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru     */
6539db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru    public void setDetachWallpaper(boolean detachWallpaper) {
6549db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru        mDetachWallpaper = detachWallpaper;
6559db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru    }
6569db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru
6579db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru    /**
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the acceleration curve type for this animation.
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the {@link Interpolator} associated to this animation
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_interpolator
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Interpolator getInterpolator() {
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mInterpolator;
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When this animation should start. If the animation has not startet yet,
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this method might return {@link #START_ON_FIRST_FRAME}.
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the time in milliseconds when the animation should start or
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #START_ON_FIRST_FRAME}
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getStartTime() {
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStartTime;
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * How long this animation should last
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the duration in milliseconds of the animation
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_duration
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getDuration() {
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDuration;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When this animation should start, relative to StartTime
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the start offset in milliseconds
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_startOffset
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getStartOffset() {
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStartOffset;
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines what this animation should do when it reaches the end.
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return either one of {@link #REVERSE} or {@link #RESTART}
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_repeatMode
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRepeatMode() {
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRepeatMode;
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines how many times the animation should repeat. The default value
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is 0.
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the number of times the animation should repeat, or {@link #INFINITE}
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_repeatCount
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRepeatCount() {
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRepeatCount;
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If fillBefore is true, this animation will apply its transformation
721d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * before the start time of the animation. If fillBefore is false and
722d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * {@link #isFillEnabled() fillEnabled} is true, the transformation will not be applied until
723d8991c4ab02449e78745d7ecc521ca0b41ea4c53Chet Haase     * the start time of the animation.
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the animation applies its transformation before it starts
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_fillBefore
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getFillBefore() {
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFillBefore;
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If fillAfter is true, this animation will apply its transformation
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after the end time of the animation.
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the animation applies its transformation after it ends
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_fillAfter
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getFillAfter() {
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFillAfter;
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the Z ordering mode to use while running the animation as
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * previously set by {@link #setZAdjustment}.
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns one of {@link #ZORDER_NORMAL},
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ZORDER_TOP}, or {@link #ZORDER_BOTTOM}.
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#Animation_zAdjustment
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getZAdjustment() {
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mZAdjustment;
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
756de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     * Returns the background color behind the animation.
757de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     */
75880756e38882720860db52f1fcc21fa1505a02abfTor Norbye    @ColorInt
759de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    public int getBackgroundColor() {
760de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn        return mBackgroundColor;
761de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    }
762de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn
763de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    /**
7649db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru     * Return value of {@link #setDetachWallpaper(boolean)}.
7659db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru     * @attr ref android.R.styleable#Animation_detachWallpaper
7669db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru     */
7679db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru    public boolean getDetachWallpaper() {
7689db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru        return mDetachWallpaper;
7699db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru    }
7709db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru
7719db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru    /**
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicates whether or not this animation will affect the transformation
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * matrix. For instance, a fade animation will not affect the matrix whereas
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a scale animation will.</p>
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if this animation will change the transformation matrix
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean willChangeTransformationMatrix() {
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // assume we will change the matrix
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicates whether or not this animation will affect the bounds of the
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * animated view. For instance, a fade animation will not affect the bounds
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * whereas a 200% scale animation will.</p>
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if this animation will change the view's bounds
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean willChangeBounds() {
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // assume we will change the bounds
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Binds an animation listener to this animation. The animation listener
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is notified of animation events such as the end of the animation or the
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * repetition of the animation.</p>
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param listener the animation listener to be notified
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAnimationListener(AnimationListener listener) {
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mListener = listener;
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gurantees that this animation has an interpolator. Will use
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a AccelerateDecelerateInterpolator is nothing else was specified.
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void ensureInterpolator() {
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInterpolator == null) {
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInterpolator = new AccelerateDecelerateInterpolator();
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Compute a hint at how long the entire animation may last, in milliseconds.
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Animations can be written to cause themselves to run for a different
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * duration than what is computed here, but generally this should be
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * accurate.
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeDurationHint() {
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (getStartOffset() + getDuration()) * (getRepeatCount() + 1);
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the transformation to apply at a specified point in time. Implementations of this
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method should always replace the specified Transformation or document they are doing
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * otherwise.
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param currentTime Where we are in the animation. This is wall clock time.
8326908cd154c5a2ed2e3b21d40f51952d45be69184Dianne Hackborn     * @param outTransformation A transformation object that is provided by the
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        caller and will be filled in by the animation.
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the animation is still running
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getTransformation(long currentTime, Transformation outTransformation) {
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mStartTime == -1) {
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStartTime = currentTime;
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long startOffset = getStartOffset();
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long duration = mDuration;
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float normalizedTime;
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (duration != 0) {
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            normalizedTime = ((float) (currentTime - (mStartTime + startOffset))) /
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (float) duration;
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // time is a step-change with a zero duration
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            normalizedTime = currentTime < mStartTime ? 0.0f : 1.0f;
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean expired = normalizedTime >= 1.0f;
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMore = !expired;
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mFillEnabled) normalizedTime = Math.max(Math.min(normalizedTime, 1.0f), 0.0f);
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((normalizedTime >= 0.0f || mFillBefore) && (normalizedTime <= 1.0f || mFillAfter)) {
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mStarted) {
859393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                fireAnimationStart();
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarted = true;
861877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom                if (USE_CLOSEGUARD) {
862877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom                    guard.open("cancel or detach or getTransformation");
863877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom                }
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFillEnabled) normalizedTime = Math.max(Math.min(normalizedTime, 1.0f), 0.0f);
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCycleFlip) {
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normalizedTime = 1.0f - normalizedTime;
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final float interpolatedTime = mInterpolator.getInterpolation(normalizedTime);
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applyTransformation(interpolatedTime, outTransformation);
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (expired) {
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mRepeatCount == mRepeated) {
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mEnded) {
8795180d1c52209f6cd86f2273da6105205c505510aRomain Guy                    mEnded = true;
880877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom                    guard.close();
881393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                    fireAnimationEnd();
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mRepeatCount > 0) {
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRepeated++;
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mRepeatMode == REVERSE) {
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCycleFlip = !mCycleFlip;
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartTime = -1;
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMore = true;
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
895393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy                fireAnimationRepeat();
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mMore && mOneMoreTime) {
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOneMoreTime = false;
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMore;
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
906393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy
907393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy    private void fireAnimationStart() {
908393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy        if (mListener != null) {
909393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy            if (mListenerHandler == null) mListener.onAnimationStart(this);
910393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy            else mListenerHandler.postAtFrontOfQueue(mOnStart);
911393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy        }
912393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy    }
913393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy
914393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy    private void fireAnimationRepeat() {
915393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy        if (mListener != null) {
916393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy            if (mListenerHandler == null) mListener.onAnimationRepeat(this);
917393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy            else mListenerHandler.postAtFrontOfQueue(mOnRepeat);
918393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy        }
919393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy    }
920393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy
921393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy    private void fireAnimationEnd() {
922393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy        if (mListener != null) {
923393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy            if (mListenerHandler == null) mListener.onAnimationEnd(this);
924393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy            else mListenerHandler.postAtFrontOfQueue(mOnEnd);
925393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy        }
926393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy    }
927393a52c9f628bbf2ab68508913177650f9183ee4Romain Guy
9284846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase    /**
9294846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     * Gets the transformation to apply at a specified point in time. Implementations of this
9304846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     * method should always replace the specified Transformation or document they are doing
9314846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     * otherwise.
9324846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     *
9334846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     * @param currentTime Where we are in the animation. This is wall clock time.
9348078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn     * @param outTransformation A transformation object that is provided by the
9354846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     *        caller and will be filled in by the animation.
9364846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     * @param scale Scaling factor to apply to any inputs to the transform operation, such
9374846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     *        pivot points being rotated or scaled around.
9384846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     * @return True if the animation is still running
9394846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase     */
9404846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase    public boolean getTransformation(long currentTime, Transformation outTransformation,
9414846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase            float scale) {
9424846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase        mScaleFactor = scale;
9434846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase        return getTransformation(currentTime, outTransformation);
9444846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase    }
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicates whether this animation has started or not.</p>
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the animation has started, false otherwise
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasStarted() {
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStarted;
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicates whether this animation has ended or not.</p>
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the animation has ended, false otherwise
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasEnded() {
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mEnded;
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Helper for getTransformation. Subclasses should implement this to apply
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * their transforms given an interpolation value.  Implementations of this
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method should always replace the specified Transformation or document
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * they are doing otherwise.
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param interpolatedTime The value of the normalized time (0.0 to 1.0)
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        after it has been run through the interpolation function.
9725c4d41ecb3282fcd5798dd848b3e4d0cb2d2ecccRobert Ly     * @param t The Transformation object to fill in with the current
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        transforms.
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void applyTransformation(float interpolatedTime, Transformation t) {
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convert the information in the description of a size to an actual
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * dimension
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param type One of Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             Animation.RELATIVE_TO_PARENT.
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param value The dimension associated with the type parameter
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param size The size of the object being animated
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param parentSize The size of the parent of the object being animated
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The dimension to use for the animation
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected float resolveSize(int type, float value, int size, int parentSize) {
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (type) {
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ABSOLUTE:
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return value;
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case RELATIVE_TO_SELF:
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return size * value;
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case RELATIVE_TO_PARENT:
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return parentSize * value;
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return value;
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param left
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param top
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param right
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bottom
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param invalidate
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param transformation
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getInvalidateRegion(int left, int top, int right, int bottom,
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            RectF invalidate, Transformation transformation) {
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final RectF tempRegion = mRegion;
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final RectF previousRegion = mPreviousRegion;
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidate.set(left, top, right, bottom);
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        transformation.getMatrix().mapRect(invalidate);
10204df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        // Enlarge the invalidate region to account for rounding errors
10214df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        invalidate.inset(-1.0f, -1.0f);
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tempRegion.set(invalidate);
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidate.union(previousRegion);
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        previousRegion.set(tempRegion);
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Transformation tempTransformation = mTransformation;
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Transformation previousTransformation = mPreviousTransformation;
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tempTransformation.set(transformation);
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        transformation.set(previousTransformation);
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        previousTransformation.set(tempTransformation);
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param left
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param top
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param right
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bottom
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void initializeInvalidateRegion(int left, int top, int right, int bottom) {
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final RectF region = mPreviousRegion;
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        region.set(left, top, right, bottom);
10464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        // Enlarge the invalidate region to account for rounding errors
10474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        region.inset(-1.0f, -1.0f);
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFillBefore) {
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Transformation previousTransformation = mPreviousTransformation;
10504766defdd0778d7e0a656179d03a4865a9a40523Andreas Agvard            applyTransformation(mInterpolator.getInterpolation(0.0f), previousTransformation);
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1054877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom    protected void finalize() throws Throwable {
1055877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom        try {
1056877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom            if (guard != null) {
1057877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom                guard.warnIfOpen();
1058877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom            }
1059877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom        } finally {
1060877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom            super.finalize();
1061877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom        }
1062877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom    }
1063877e0b99eedfd22590db4a1663ca8a3b8e6b63d2Brian Carlstrom
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1065d4745a689f36211afaff396874d78b1d5202762dRomain Guy     * Return true if this animation changes the view's alpha property.
1066d4745a689f36211afaff396874d78b1d5202762dRomain Guy     *
1067d4745a689f36211afaff396874d78b1d5202762dRomain Guy     * @hide
1068d4745a689f36211afaff396874d78b1d5202762dRomain Guy     */
1069d4745a689f36211afaff396874d78b1d5202762dRomain Guy    public boolean hasAlpha() {
1070d4745a689f36211afaff396874d78b1d5202762dRomain Guy        return false;
1071d4745a689f36211afaff396874d78b1d5202762dRomain Guy    }
1072d4745a689f36211afaff396874d78b1d5202762dRomain Guy
1073d4745a689f36211afaff396874d78b1d5202762dRomain Guy    /**
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Utility class to parse a string description of a size.
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static class Description {
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * One of Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Animation.RELATIVE_TO_PARENT.
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int type;
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The absolute or relative dimension for this Description.
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float value;
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Size descriptions can appear inthree forms:
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <ol>
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <li>An absolute size. This is represented by a number.</li>
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <li>A size relative to the size of the object being animated. This
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * is represented by a number followed by "%".</li> *
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <li>A size relative to the size of the parent of object being
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * animated. This is represented by a number followed by "%p".</li>
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * </ol>
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param value The typed value to parse
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return The parsed version of the description
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static Description parseValue(TypedValue value) {
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Description d = new Description();
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value == null) {
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                d.type = ABSOLUTE;
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                d.value = 0;
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value.type == TypedValue.TYPE_FRACTION) {
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    d.type = (value.data & TypedValue.COMPLEX_UNIT_MASK) ==
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            TypedValue.COMPLEX_UNIT_FRACTION_PARENT ?
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    RELATIVE_TO_PARENT : RELATIVE_TO_SELF;
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    d.value = TypedValue.complexToFloat(value.data);
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return d;
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (value.type == TypedValue.TYPE_FLOAT) {
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    d.type = ABSOLUTE;
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    d.value = value.getFloat();
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return d;
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (value.type >= TypedValue.TYPE_FIRST_INT &&
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        value.type <= TypedValue.TYPE_LAST_INT) {
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    d.type = ABSOLUTE;
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    d.value = value.data;
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return d;
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.type = ABSOLUTE;
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.value = 0.0f;
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return d;
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>An animation listener receives notifications from an animation.
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Notifications indicate animation related events, such as the end or the
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * repetition of the animation.</p>
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface AnimationListener {
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <p>Notifies the start of the animation.</p>
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param animation The started animation.
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onAnimationStart(Animation animation);
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <p>Notifies the end of the animation. This callback is not invoked
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * for animations with repeat count set to INFINITE.</p>
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param animation The animation which reached its end.
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onAnimationEnd(Animation animation);
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <p>Notifies the repetition of the animation.</p>
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param animation The animation which was repeated.
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onAnimationRepeat(Animation animation);
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1160