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 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 21c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haaseimport android.os.Build; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.RectF; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Represents a group of Animations that should be played together. 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The transformation of each individual animation are composed 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * together into a single transform. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If AnimationSet sets any properties that its children also set 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (for example, duration or fillBefore), the values of AnimationSet 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * override the child values. 35c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * 36c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * <p>The way that AnimationSet inherits behavior from Animation is important to 37c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * understand. Some of the Animation attributes applied to AnimationSet affect the 38c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * AnimationSet itself, some are pushed down to the children, and some are ignored, 39c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * as follows: 40c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * <ul> 41c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * <li>duration, repeatMode, fillBefore, fillAfter: These properties, when set 42c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * on an AnimationSet object, will be pushed down to all child animations.</li> 43c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * <li>repeatCount, fillEnabled: These properties are ignored for AnimationSet.</li> 44c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * <li>startOffset, shareInterpolator: These properties apply to the AnimationSet itself.</li> 45c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * </ul> 46c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * Starting with {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, 47c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * the behavior of these properties is the same in XML resources and at runtime (prior to that 48c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * release, the values set in XML were ignored for AnimationSet). That is, calling 49c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * <code>setDuration(500)</code> on an AnimationSet has the same effect as declaring 50c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase * <code>android:duration="500"</code> in an XML resource for an AnimationSet object.</p> 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AnimationSet extends Animation { 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PROPERTY_FILL_AFTER_MASK = 0x1; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PROPERTY_FILL_BEFORE_MASK = 0x2; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PROPERTY_REPEAT_MODE_MASK = 0x4; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PROPERTY_START_OFFSET_MASK = 0x8; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PROPERTY_SHARE_INTERPOLATOR_MASK = 0x10; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PROPERTY_DURATION_MASK = 0x20; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PROPERTY_MORPH_MATRIX_MASK = 0x40; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int PROPERTY_CHANGE_BOUNDS_MASK = 0x80; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mFlags = 0; 63d4745a689f36211afaff396874d78b1d5202762dRomain Guy private boolean mDirty; 64d4745a689f36211afaff396874d78b1d5202762dRomain Guy private boolean mHasAlpha; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<Animation> mAnimations = new ArrayList<Animation>(); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Transformation mTempTransformation = new Transformation(); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mLastEnd; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long[] mStoredOffsets; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 75bdbdc4f92951200a88d4c754448b9f91626ffc04The Android Open Source Project * Constructor used when an AnimationSet is loaded from a resource. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Application context to use 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param attrs Attribute set from which to read values 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AnimationSet(Context context, AttributeSet attrs) { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.AnimationSet); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFlag(PROPERTY_SHARE_INTERPOLATOR_MASK, 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.getBoolean(com.android.internal.R.styleable.AnimationSet_shareInterpolator, true)); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(); 89c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase 90c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase if (context.getApplicationInfo().targetSdkVersion >= 91c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 928962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn if (a.hasValue(com.android.internal.R.styleable.AnimationSet_duration)) { 93c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase mFlags |= PROPERTY_DURATION_MASK; 94c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase } 958962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn if (a.hasValue(com.android.internal.R.styleable.AnimationSet_fillBefore)) { 96c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase mFlags |= PROPERTY_FILL_BEFORE_MASK; 97c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase } 988962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn if (a.hasValue(com.android.internal.R.styleable.AnimationSet_fillAfter)) { 99c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase mFlags |= PROPERTY_FILL_AFTER_MASK; 100c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase } 1018962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn if (a.hasValue(com.android.internal.R.styleable.AnimationSet_repeatMode)) { 102c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase mFlags |= PROPERTY_REPEAT_MODE_MASK; 103c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase } 1048962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn if (a.hasValue(com.android.internal.R.styleable.AnimationSet_startOffset)) { 105c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase mFlags |= PROPERTY_START_OFFSET_MASK; 106c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase } 107c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase } 108c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor to use when building an AnimationSet from code 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param shareInterpolator Pass true if all of the animations in this set 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should use the interpolator assocciated with this AnimationSet. 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pass false if each animation should use its own interpolator. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AnimationSet(boolean shareInterpolator) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFlag(PROPERTY_SHARE_INTERPOLATOR_MASK, shareInterpolator); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected AnimationSet clone() throws CloneNotSupportedException { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AnimationSet animation = (AnimationSet) super.clone(); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animation.mTempTransformation = new Transformation(); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animation.mAnimations = new ArrayList<Animation>(); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mAnimations.size(); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Animation> animations = mAnimations; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animation.mAnimations.add(animations.get(i).clone()); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return animation; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setFlag(int mask, boolean value) { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlags |= mask; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlags &= ~mask; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void init() { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime = 0; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFillAfter(boolean fillAfter) { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlags |= PROPERTY_FILL_AFTER_MASK; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setFillAfter(fillAfter); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFillBefore(boolean fillBefore) { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlags |= PROPERTY_FILL_BEFORE_MASK; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setFillBefore(fillBefore); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setRepeatMode(int repeatMode) { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlags |= PROPERTY_REPEAT_MODE_MASK; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setRepeatMode(repeatMode); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setStartOffset(long startOffset) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlags |= PROPERTY_START_OFFSET_MASK; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setStartOffset(startOffset); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 177c9bcebe969fd6fac40bcef4f23dd8fe99290a90bRomain Guy /** 178c9bcebe969fd6fac40bcef4f23dd8fe99290a90bRomain Guy * @hide 179c9bcebe969fd6fac40bcef4f23dd8fe99290a90bRomain Guy */ 180d4745a689f36211afaff396874d78b1d5202762dRomain Guy @Override 181d4745a689f36211afaff396874d78b1d5202762dRomain Guy public boolean hasAlpha() { 182d4745a689f36211afaff396874d78b1d5202762dRomain Guy if (mDirty) { 183d4745a689f36211afaff396874d78b1d5202762dRomain Guy mDirty = mHasAlpha = false; 184d4745a689f36211afaff396874d78b1d5202762dRomain Guy 185d4745a689f36211afaff396874d78b1d5202762dRomain Guy final int count = mAnimations.size(); 186d4745a689f36211afaff396874d78b1d5202762dRomain Guy final ArrayList<Animation> animations = mAnimations; 187d4745a689f36211afaff396874d78b1d5202762dRomain Guy 188d4745a689f36211afaff396874d78b1d5202762dRomain Guy for (int i = 0; i < count; i++) { 189d4745a689f36211afaff396874d78b1d5202762dRomain Guy if (animations.get(i).hasAlpha()) { 190d4745a689f36211afaff396874d78b1d5202762dRomain Guy mHasAlpha = true; 191d4745a689f36211afaff396874d78b1d5202762dRomain Guy break; 192d4745a689f36211afaff396874d78b1d5202762dRomain Guy } 193d4745a689f36211afaff396874d78b1d5202762dRomain Guy } 194d4745a689f36211afaff396874d78b1d5202762dRomain Guy } 195d4745a689f36211afaff396874d78b1d5202762dRomain Guy 196d4745a689f36211afaff396874d78b1d5202762dRomain Guy return mHasAlpha; 197d4745a689f36211afaff396874d78b1d5202762dRomain Guy } 198d4745a689f36211afaff396874d78b1d5202762dRomain Guy 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the duration of every child animation.</p> 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param durationMillis the duration of the animation, in milliseconds, for 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * every child in this set 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDuration(long durationMillis) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlags |= PROPERTY_DURATION_MASK; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setDuration(durationMillis); 209c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase mLastEnd = mStartOffset + mDuration; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a child animation to this animation set. 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The transforms of the child animations are applied in the order 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that they were added 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param a Animation to add. 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addAnimation(Animation a) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimations.add(a); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean noMatrix = (mFlags & PROPERTY_MORPH_MATRIX_MASK) == 0; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (noMatrix && a.willChangeTransformationMatrix()) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlags |= PROPERTY_MORPH_MATRIX_MASK; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changeBounds = (mFlags & PROPERTY_CHANGE_BOUNDS_MASK) == 0; 2272d46fcc669ff5efe365e9be435ab9e5c5a304939Chet Haase 2282d46fcc669ff5efe365e9be435ab9e5c5a304939Chet Haase 2292d46fcc669ff5efe365e9be435ab9e5c5a304939Chet Haase if (changeBounds && a.willChangeBounds()) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlags |= PROPERTY_CHANGE_BOUNDS_MASK; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 233c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase if ((mFlags & PROPERTY_DURATION_MASK) == PROPERTY_DURATION_MASK) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastEnd = mStartOffset + mDuration; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 236c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase if (mAnimations.size() == 1) { 237c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase mDuration = a.getStartOffset() + a.getDuration(); 238c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase mLastEnd = mStartOffset + mDuration; 239c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase } else { 240c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase mLastEnd = Math.max(mLastEnd, a.getStartOffset() + a.getDuration()); 241c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase mDuration = mLastEnd - mStartOffset; 242c861bd778b1b96aa12d3400ec799d80ba38c1f38Chet Haase } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 244d4745a689f36211afaff396874d78b1d5202762dRomain Guy 245d4745a689f36211afaff396874d78b1d5202762dRomain Guy mDirty = true; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the start time of this animation and all child animations 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.animation.Animation#setStartTime(long) 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setStartTime(long startTimeMillis) { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setStartTime(startTimeMillis); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mAnimations.size(); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Animation> animations = mAnimations; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation a = animations.get(i); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.setStartTime(startTimeMillis); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getStartTime() { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long startTime = Long.MAX_VALUE; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mAnimations.size(); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Animation> animations = mAnimations; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation a = animations.get(i); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startTime = Math.min(startTime, a.getStartTime()); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return startTime; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void restrictDuration(long durationMillis) { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.restrictDuration(durationMillis); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Animation> animations = mAnimations; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = animations.size(); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animations.get(i).restrictDuration(durationMillis); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The duration of an AnimationSet is defined to be the 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * duration of the longest child animation. 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.animation.Animation#getDuration() 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getDuration() { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Animation> animations = mAnimations; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = animations.size(); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long duration = 0; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean durationSet = (mFlags & PROPERTY_DURATION_MASK) == PROPERTY_DURATION_MASK; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (durationSet) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project duration = mDuration; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project duration = Math.max(duration, animations.get(i).getDuration()); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return duration; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The duration hint of an animation set is the maximum of the duration 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hints of all of its component animations. 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.animation.Animation#computeDurationHint 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeDurationHint() { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long duration = 0; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mAnimations.size(); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Animation> animations = mAnimations; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = count - 1; i >= 0; --i) { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long d = animations.get(i).computeDurationHint(); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d > duration) duration = d; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return duration; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void initializeInvalidateRegion(int left, int top, int right, int bottom) { 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final RectF region = mPreviousRegion; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project region.set(left, top, right, bottom); 3404df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project region.inset(-1.0f, -1.0f); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFillBefore) { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mAnimations.size(); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Animation> animations = mAnimations; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Transformation temp = mTempTransformation; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Transformation previousTransformation = mPreviousTransformation; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = count - 1; i >= 0; --i) { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Animation a = animations.get(i); 3510041861a0433402b789d6530eb0ed52a1c2b4ff1Chet Haase if (!a.isFillEnabled() || a.getFillBefore() || a.getStartOffset() == 0) { 3520041861a0433402b789d6530eb0ed52a1c2b4ff1Chet Haase temp.clear(); 3530041861a0433402b789d6530eb0ed52a1c2b4ff1Chet Haase final Interpolator interpolator = a.mInterpolator; 3540041861a0433402b789d6530eb0ed52a1c2b4ff1Chet Haase a.applyTransformation(interpolator != null ? interpolator.getInterpolation(0.0f) 3550041861a0433402b789d6530eb0ed52a1c2b4ff1Chet Haase : 0.0f, temp); 3560041861a0433402b789d6530eb0ed52a1c2b4ff1Chet Haase previousTransformation.compose(temp); 3570041861a0433402b789d6530eb0ed52a1c2b4ff1Chet Haase } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The transformation of an animation set is the concatenation of all of its 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * component animations. 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.animation.Animation#getTransformation 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getTransformation(long currentTime, Transformation t) { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mAnimations.size(); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Animation> animations = mAnimations; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Transformation temp = mTempTransformation; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean more = false; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean started = false; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean ended = true; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.clear(); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = count - 1; i >= 0; --i) { 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Animation a = animations.get(i); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project temp.clear(); 3844846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase more = a.getTransformation(currentTime, temp, getScaleFactor()) || more; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.compose(temp); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project started = started || a.hasStarted(); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ended = a.hasEnded() && ended; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (started && !mStarted) { 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mListener != null) { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mListener.onAnimationStart(this); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarted = true; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ended != mEnded) { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mListener != null) { 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mListener.onAnimationEnd(this); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mEnded = ended; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return more; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.animation.Animation#scaleCurrentDuration(float) 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void scaleCurrentDuration(float scale) { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Animation> animations = mAnimations; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = animations.size(); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animations.get(i).scaleCurrentDuration(scale); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.animation.Animation#initialize(int, int, int, int) 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void initialize(int width, int height, int parentWidth, int parentHeight) { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.initialize(width, height, parentWidth, parentHeight); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean durationSet = (mFlags & PROPERTY_DURATION_MASK) == PROPERTY_DURATION_MASK; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean fillAfterSet = (mFlags & PROPERTY_FILL_AFTER_MASK) == PROPERTY_FILL_AFTER_MASK; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean fillBeforeSet = (mFlags & PROPERTY_FILL_BEFORE_MASK) == PROPERTY_FILL_BEFORE_MASK; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean repeatModeSet = (mFlags & PROPERTY_REPEAT_MODE_MASK) == PROPERTY_REPEAT_MODE_MASK; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean shareInterpolator = (mFlags & PROPERTY_SHARE_INTERPOLATOR_MASK) 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PROPERTY_SHARE_INTERPOLATOR_MASK; 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean startOffsetSet = (mFlags & PROPERTY_START_OFFSET_MASK) 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PROPERTY_START_OFFSET_MASK; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (shareInterpolator) { 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ensureInterpolator(); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Animation> children = mAnimations; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = children.size(); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long duration = mDuration; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean fillAfter = mFillAfter; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean fillBefore = mFillBefore; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int repeatMode = mRepeatMode; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Interpolator interpolator = mInterpolator; 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long startOffset = mStartOffset; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long[] storedOffsets = mStoredOffsets; 4524df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (startOffsetSet) { 4534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (storedOffsets == null || storedOffsets.length != count) { 4544df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project storedOffsets = mStoredOffsets = new long[count]; 4554df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 4564df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } else if (storedOffsets != null) { 4574df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project storedOffsets = mStoredOffsets = null; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation a = children.get(i); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (durationSet) { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.setDuration(duration); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fillAfterSet) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.setFillAfter(fillAfter); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fillBeforeSet) { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.setFillBefore(fillBefore); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (repeatModeSet) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.setRepeatMode(repeatMode); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (shareInterpolator) { 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.setInterpolator(interpolator); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startOffsetSet) { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long offset = a.getStartOffset(); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.setStartOffset(offset + startOffset); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project storedOffsets[i] = offset; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.initialize(width, height, parentWidth, parentHeight); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reset() { 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.reset(); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restoreChildrenStartOffset(); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void restoreChildrenStartOffset() { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long[] offsets = mStoredOffsets; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (offsets == null) return; 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Animation> children = mAnimations; 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = children.size(); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children.get(i).setStartOffset(offsets[i]); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return All the child animations in this AnimationSet. Note that 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this may include other AnimationSets, which are not expanded. 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<Animation> getAnimations() { 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAnimations; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean willChangeTransformationMatrix() { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (mFlags & PROPERTY_MORPH_MATRIX_MASK) == PROPERTY_MORPH_MATRIX_MASK; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean willChangeBounds() { 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (mFlags & PROPERTY_CHANGE_BOUNDS_MASK) == PROPERTY_CHANGE_BOUNDS_MASK; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 525