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