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