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.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbyeimport android.annotation.AnimRes; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AnimationUtils; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for a {@link FrameLayout} container that will perform animations 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when switching between its views. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewAnimator_inAnimation 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewAnimator_outAnimation 35f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang * @attr ref android.R.styleable#ViewAnimator_animateFirstView 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ViewAnimator extends FrameLayout { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mWhichChild = 0; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mFirstTime = true; 41f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mAnimateFirstTime = true; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation mInAnimation; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation mOutAnimation; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ViewAnimator(Context context) { 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 491162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey initViewAnimator(context, null); 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ViewAnimator(Context context, AttributeSet attrs) { 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.ViewAnimator); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int resource = a.getResourceId(com.android.internal.R.styleable.ViewAnimator_inAnimation, 0); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resource > 0) { 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInAnimation(context, resource); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resource = a.getResourceId(com.android.internal.R.styleable.ViewAnimator_outAnimation, 0); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resource > 0) { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setOutAnimation(context, resource); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang 66f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang boolean flag = a.getBoolean(com.android.internal.R.styleable.ViewAnimator_animateFirstView, true); 67f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang setAnimateFirstView(flag); 68f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 711162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey initViewAnimator(context, attrs); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 741162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 751162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Initialize this {@link ViewAnimator}, possibly setting 761162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * {@link #setMeasureAllChildren(boolean)} based on {@link FrameLayout} flags. 771162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 781162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey private void initViewAnimator(Context context, AttributeSet attrs) { 791162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey if (attrs == null) { 801162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey // For compatibility, always measure children when undefined. 811162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey mMeasureAllChildren = true; 821162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey return; 831162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 841162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 851162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey // For compatibility, default to measure children, but allow XML 861162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey // attribute to override. 871162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey final TypedArray a = context.obtainStyledAttributes(attrs, 881162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey com.android.internal.R.styleable.FrameLayout); 891162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey final boolean measureAllChildren = a.getBoolean( 901162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey com.android.internal.R.styleable.FrameLayout_measureAllChildren, true); 911162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey setMeasureAllChildren(measureAllChildren); 921162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey a.recycle(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 94f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets which child view will be displayed. 97f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang * 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param whichChild the index of the child view to display 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1000b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen @android.view.RemotableViewMethod 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDisplayedChild(int whichChild) { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWhichChild = whichChild; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (whichChild >= getChildCount()) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWhichChild = 0; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (whichChild < 0) { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWhichChild = getChildCount() - 1; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasFocus = getFocusedChild() != null; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This will clear old focus if we had it 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showOnly(mWhichChild); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasFocus) { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Try to retake focus if we had it 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestFocus(FOCUS_FORWARD); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 116f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the index of the currently displayed child view. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDisplayedChild() { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mWhichChild; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 123f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Manually shows the next child. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1270b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen @android.view.RemotableViewMethod 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void showNext() { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDisplayedChild(mWhichChild + 1); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Manually shows the previous child. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1350b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen @android.view.RemotableViewMethod 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void showPrevious() { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDisplayedChild(mWhichChild - 1); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 141f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang * Shows only the specified child. The other displays Views exit the screen, 142f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang * optionally with the with the {@link #getOutAnimation() out animation} and 143f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang * the specified child enters the screen, optionally with the 144f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang * {@link #getInAnimation() in animation}. 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param childIndex The index of the child to be shown. 147f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang * @param animate Whether or not to use the in and out animations, defaults 148f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang * to true. 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 150f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang void showOnly(int childIndex, boolean animate) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = getChildCount(); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = getChildAt(i); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i == childIndex) { 155f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang if (animate && mInAnimation != null) { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.startAnimation(mInAnimation); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.setVisibility(View.VISIBLE); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFirstTime = false; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 161f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang if (animate && mOutAnimation != null && child.getVisibility() == View.VISIBLE) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.startAnimation(mOutAnimation); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (child.getAnimation() == mInAnimation) 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.clearAnimation(); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.setVisibility(View.GONE); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 169f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang /** 170f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang * Shows only the specified child. The other displays Views exit the screen 171f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang * with the {@link #getOutAnimation() out animation} and the specified child 172f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang * enters the screen with the {@link #getInAnimation() in animation}. 173f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang * 174f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang * @param childIndex The index of the child to be shown. 175f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang */ 176f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang void showOnly(int childIndex) { 177f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang final boolean animate = (!mFirstTime || mAnimateFirstTime); 178f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang showOnly(childIndex, animate); 179f70036bc91e93cf6834c835beb832861c0dbd9dbMason Tang } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addView(View child, int index, ViewGroup.LayoutParams params) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.addView(child, index, params); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getChildCount() == 1) { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.setVisibility(View.VISIBLE); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.setVisibility(View.GONE); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 189baea244a9fadd6fc30c1491085d01e1fe30f8ca4Chet Haase if (index >= 0 && mWhichChild >= index) { 190baea244a9fadd6fc30c1491085d01e1fe30f8ca4Chet Haase // Added item above current one, increment the index of the displayed child 191baea244a9fadd6fc30c1491085d01e1fe30f8ca4Chet Haase setDisplayedChild(mWhichChild + 1); 192baea244a9fadd6fc30c1491085d01e1fe30f8ca4Chet Haase } 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeAllViews() { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.removeAllViews(); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWhichChild = 0; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFirstTime = true; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeView(View view) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int index = indexOfChild(view); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index >= 0) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeViewAt(index); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeViewAt(int index) { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.removeViewAt(index); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int childCount = getChildCount(); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (childCount == 0) { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWhichChild = 0; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFirstTime = true; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mWhichChild >= childCount) { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Displayed is above child count, so float down to top of stack 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDisplayedChild(childCount - 1); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mWhichChild == index) { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Displayed was removed, so show the new child living in its place 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDisplayedChild(mWhichChild); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeViewInLayout(View view) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeView(view); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeViews(int start, int count) { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.removeViews(start, count); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getChildCount() == 0) { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWhichChild = 0; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFirstTime = true; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mWhichChild >= start && mWhichChild < start + count) { 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Try showing new displayed child, wrapping if needed 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDisplayedChild(mWhichChild); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeViewsInLayout(int start, int count) { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeViews(start, count); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the View corresponding to the currently displayed child. 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The View currently displayed. 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDisplayedChild() 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getCurrentView() { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getChildAt(mWhichChild); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current animation used to animate a View that enters the screen. 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return An Animation or null if none is set. 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setInAnimation(android.view.animation.Animation) 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setInAnimation(android.content.Context, int) 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Animation getInAnimation() { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInAnimation; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specifies the animation used to animate a View that enters the screen. 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param inAnimation The animation started when a View enters the screen. 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getInAnimation() 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setInAnimation(android.content.Context, int) 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInAnimation(Animation inAnimation) { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInAnimation = inAnimation; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current animation used to animate a View that exits the screen. 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return An Animation or null if none is set. 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setOutAnimation(android.view.animation.Animation) 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setOutAnimation(android.content.Context, int) 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Animation getOutAnimation() { 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOutAnimation; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specifies the animation used to animate a View that exit the screen. 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param outAnimation The animation started when a View exit the screen. 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getOutAnimation() 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setOutAnimation(android.content.Context, int) 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOutAnimation(Animation outAnimation) { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOutAnimation = outAnimation; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specifies the animation used to animate a View that enters the screen. 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The application's environment. 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resourceID The resource id of the animation. 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getInAnimation() 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setInAnimation(android.view.animation.Animation) 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 313417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye public void setInAnimation(Context context, @AnimRes int resourceID) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInAnimation(AnimationUtils.loadAnimation(context, resourceID)); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specifies the animation used to animate a View that exit the screen. 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The application's environment. 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resourceID The resource id of the animation. 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getOutAnimation() 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setOutAnimation(android.view.animation.Animation) 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 326417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye public void setOutAnimation(Context context, @AnimRes int resourceID) { 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setOutAnimation(AnimationUtils.loadAnimation(context, resourceID)); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 331201501f11e2934f63f9692383ade0620c45febaeChet Haase * Returns whether the current View should be animated the first time the ViewAnimator 332201501f11e2934f63f9692383ade0620c45febaeChet Haase * is displayed. 333201501f11e2934f63f9692383ade0620c45febaeChet Haase * 334201501f11e2934f63f9692383ade0620c45febaeChet Haase * @return true if the current View will be animated the first time it is displayed, 335201501f11e2934f63f9692383ade0620c45febaeChet Haase * false otherwise. 336201501f11e2934f63f9692383ade0620c45febaeChet Haase * 337201501f11e2934f63f9692383ade0620c45febaeChet Haase * @see #setAnimateFirstView(boolean) 338201501f11e2934f63f9692383ade0620c45febaeChet Haase */ 339201501f11e2934f63f9692383ade0620c45febaeChet Haase public boolean getAnimateFirstView() { 340201501f11e2934f63f9692383ade0620c45febaeChet Haase return mAnimateFirstTime; 341201501f11e2934f63f9692383ade0620c45febaeChet Haase } 342201501f11e2934f63f9692383ade0620c45febaeChet Haase 343201501f11e2934f63f9692383ade0620c45febaeChet Haase /** 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether the current View should be animated the first time 345201501f11e2934f63f9692383ade0620c45febaeChet Haase * the ViewAnimator is displayed. 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param animate True to animate the current View the first time it is displayed, 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false otherwise. 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAnimateFirstView(boolean animate) { 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimateFirstTime = animate; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getBaseline() { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (getCurrentView() != null) ? getCurrentView().getBaseline() : super.getBaseline(); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3588a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov 3598a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov @Override 360a7bb6fbeab933326d58aa806d8194b7b13239d34Dianne Hackborn public CharSequence getAccessibilityClassName() { 361a7bb6fbeab933326d58aa806d8194b7b13239d34Dianne Hackborn return ViewAnimator.class.getName(); 3628a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 364