TransitionDrawable.java revision b3c56086d802ae28888dd97ba1f49bd6cee0b673
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 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.graphics.drawable;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19c2974809373697147cbe5754835cc871fb93aef1Dianne Hackbornimport android.content.res.Resources;
2052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport android.content.res.Resources.Theme;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An extension of LayerDrawables that is intended to cross-fade between
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the first and second layer. To start the transition, call {@link #startTransition(int)}. To
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * display just the first layer, call {@link #resetTransition()}.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It can be defined in an XML file with the <code>&lt;transition></code> element.
30dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * Each Drawable in the transition is defined in a nested <code>&lt;item></code>. For more
31dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * information, see the guide to <a
32dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.</p>
33dfe5c204403bc56c29bb36410574eab8b1950417Scott Main *
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#LayerDrawableItem_left
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#LayerDrawableItem_top
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#LayerDrawableItem_right
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#LayerDrawableItem_bottom
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#LayerDrawableItem_drawable
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#LayerDrawableItem_id
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class TransitionDrawable extends LayerDrawable implements Drawable.Callback {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
45b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette     * A transition is about to start.
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int TRANSITION_STARTING = 0;
48b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The transition has started and the animation is in progress
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int TRANSITION_RUNNING = 1;
53b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * No transition will be applied
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int TRANSITION_NONE = 2;
58b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The current state of the transition. One of {@link #TRANSITION_STARTING},
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #TRANSITION_RUNNING} and {@link #TRANSITION_NONE}
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mTransitionState = TRANSITION_NONE;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mReverse;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mStartTimeMillis;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mFrom;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mTo;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mDuration;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mOriginalDuration;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mAlpha = 0;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mCrossFade;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new transition drawable with the specified list of layers. At least
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * 2 layers are required for this drawable to work properly.
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public TransitionDrawable(Drawable[] layers) {
79c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        this(new TransitionState(null, null, null), layers);
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new transition drawable with no layer. To work correctly, at least 2
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * layers must be added to this drawable.
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #TransitionDrawable(Drawable[])
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    TransitionDrawable() {
8952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        this(new TransitionState(null, null, null), null, null);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    private TransitionDrawable(TransitionState state, Resources res, Theme theme) {
9352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        super(state, res, theme);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TransitionDrawable(TransitionState state, Drawable[] layers) {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(layers, state);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
101c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn    LayerState createConstantState(LayerState state, Resources res) {
102c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        return new TransitionState((TransitionState) state, this, res);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
104b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Begin the second layer on top of the first layer.
107b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette     *
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param durationMillis The length of the transition in milliseconds
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startTransition(int durationMillis) {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFrom = 0;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTo = 255;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAlpha = 0;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDuration = mOriginalDuration = durationMillis;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mReverse = false;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransitionState = TRANSITION_STARTING;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidateSelf();
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
119b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Show only the first layer.
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void resetTransition() {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAlpha = 0;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransitionState = TRANSITION_NONE;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidateSelf();
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Reverses the transition, picking up where the transition currently is.
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the transition is not currently running, this will start the transition
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with the specified duration. If the transition is already running, the last
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * known duration will be used.
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param duration The duration to use if no transition is running.
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void reverseTransition(int duration) {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long time = SystemClock.uptimeMillis();
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Animation is over
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (time - mStartTimeMillis > mDuration) {
14165e293273a2bd1598af46e3a070733bfc5688ac3Michael Jurka            if (mTo == 0) {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFrom = 0;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTo = 255;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAlpha = 0;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReverse = false;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFrom = 255;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTo = 0;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAlpha = 255;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReverse = true;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDuration = mOriginalDuration = duration;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTransitionState = TRANSITION_STARTING;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            invalidateSelf();
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mReverse = !mReverse;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFrom = mAlpha;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTo = mReverse ? 0 : 255;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDuration = (int) (mReverse ? time - mStartTimeMillis :
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOriginalDuration - (time - mStartTimeMillis));
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransitionState = TRANSITION_STARTING;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas) {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean done = true;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (mTransitionState) {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case TRANSITION_STARTING:
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartTimeMillis = SystemClock.uptimeMillis();
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                done = false;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTransitionState = TRANSITION_RUNNING;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case TRANSITION_RUNNING:
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mStartTimeMillis >= 0) {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float normalized = (float)
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            (SystemClock.uptimeMillis() - mStartTimeMillis) / mDuration;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    done = normalized >= 1.0f;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    normalized = Math.min(normalized, 1.0f);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAlpha = (int) (mFrom  + (mTo - mFrom) * normalized);
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
187b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int alpha = mAlpha;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean crossFade = mCrossFade;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ChildDrawable[] array = mLayerState.mChildren;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
192ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase        if (done) {
193ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase            // the setAlpha() calls below trigger invalidation and redraw. If we're done, just draw
194ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase            // the appropriate drawable[s] and return
195ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase            if (!crossFade || alpha == 0) {
196ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase                array[0].mDrawable.draw(canvas);
197ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase            }
198ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase            if (alpha == 0xFF) {
199ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase                array[1].mDrawable.draw(canvas);
200ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase            }
201ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase            return;
202ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase        }
203ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase
204ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase        Drawable d;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        d = array[0].mDrawable;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (crossFade) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.setAlpha(255 - alpha);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        d.draw(canvas);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (crossFade) {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.setAlpha(0xFF);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (alpha > 0) {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d = array[1].mDrawable;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.setAlpha(alpha);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.draw(canvas);
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.setAlpha(0xFF);
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
220b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!done) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            invalidateSelf();
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Enables or disables the cross fade of the drawables. When cross fade
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is disabled, the first drawable is always drawn opaque. With cross
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * fade enabled, the first drawable is drawn with the opposite alpha of
230dfe5c204403bc56c29bb36410574eab8b1950417Scott Main     * the second drawable. Cross fade is disabled by default.
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param enabled True to enable cross fading, false otherwise.
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCrossFadeEnabled(boolean enabled) {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCrossFade = enabled;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether the cross fade is enabled for this transition.
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if cross fading is enabled, false otherwise.
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isCrossFadeEnabled() {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCrossFade;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class TransitionState extends LayerState {
248c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        TransitionState(TransitionState orig, TransitionDrawable owner,
249c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn                Resources res) {
250c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn            super(orig, owner, res);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Drawable newDrawable() {
25552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            return new TransitionDrawable(this, null, null);
256c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        }
257c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn
258c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        @Override
259c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        public Drawable newDrawable(Resources res) {
26052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            return new TransitionDrawable(this, res, null);
26152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
26252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
26352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        @Override
26452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        public Drawable newDrawable(Resources res, Theme theme) {
26552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            return new TransitionDrawable(this, res, theme);
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getChangingConfigurations() {
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mChangingConfigurations;
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
274