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;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An extension of LayerDrawables that is intended to cross-fade between
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the first and second layer. To start the transition, call {@link #startTransition(int)}. To
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * display just the first layer, call {@link #resetTransition()}.
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It can be defined in an XML file with the <code>&lt;transition></code> element.
29dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * Each Drawable in the transition is defined in a nested <code>&lt;item></code>. For more
30dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * information, see the guide to <a
31dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.</p>
32dfe5c204403bc56c29bb36410574eab8b1950417Scott Main *
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#LayerDrawableItem_left
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#LayerDrawableItem_top
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#LayerDrawableItem_right
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#LayerDrawableItem_bottom
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#LayerDrawableItem_drawable
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#LayerDrawableItem_id
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class TransitionDrawable extends LayerDrawable implements Drawable.Callback {
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
44b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette     * A transition is about to start.
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int TRANSITION_STARTING = 0;
47b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The transition has started and the animation is in progress
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int TRANSITION_RUNNING = 1;
52b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * No transition will be applied
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int TRANSITION_NONE = 2;
57b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The current state of the transition. One of {@link #TRANSITION_STARTING},
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #TRANSITION_RUNNING} and {@link #TRANSITION_NONE}
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mTransitionState = TRANSITION_NONE;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mReverse;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mStartTimeMillis;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mFrom;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mTo;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mDuration;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mOriginalDuration;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mAlpha = 0;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mCrossFade;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new transition drawable with the specified list of layers. At least
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * 2 layers are required for this drawable to work properly.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public TransitionDrawable(Drawable[] layers) {
78c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        this(new TransitionState(null, null, null), layers);
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new transition drawable with no layer. To work correctly, at least 2
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * layers must be added to this drawable.
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #TransitionDrawable(Drawable[])
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    TransitionDrawable() {
8817cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette        this(new TransitionState(null, null, null), (Resources) null);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9117cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette    private TransitionDrawable(TransitionState state, Resources res) {
9217cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette        super(state, res);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TransitionDrawable(TransitionState state, Drawable[] layers) {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(layers, state);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
100c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn    LayerState createConstantState(LayerState state, Resources res) {
101c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        return new TransitionState((TransitionState) state, this, res);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
103b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Begin the second layer on top of the first layer.
106b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette     *
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param durationMillis The length of the transition in milliseconds
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startTransition(int durationMillis) {
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFrom = 0;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTo = 255;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAlpha = 0;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDuration = mOriginalDuration = durationMillis;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mReverse = false;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransitionState = TRANSITION_STARTING;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidateSelf();
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
118b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Show only the first layer.
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void resetTransition() {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAlpha = 0;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransitionState = TRANSITION_NONE;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidateSelf();
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Reverses the transition, picking up where the transition currently is.
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the transition is not currently running, this will start the transition
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with the specified duration. If the transition is already running, the last
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * known duration will be used.
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param duration The duration to use if no transition is running.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void reverseTransition(int duration) {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long time = SystemClock.uptimeMillis();
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Animation is over
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (time - mStartTimeMillis > mDuration) {
14065e293273a2bd1598af46e3a070733bfc5688ac3Michael Jurka            if (mTo == 0) {
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFrom = 0;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTo = 255;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAlpha = 0;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReverse = false;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFrom = 255;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTo = 0;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAlpha = 255;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReverse = true;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDuration = mOriginalDuration = duration;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTransitionState = TRANSITION_STARTING;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            invalidateSelf();
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mReverse = !mReverse;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFrom = mAlpha;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTo = mReverse ? 0 : 255;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDuration = (int) (mReverse ? time - mStartTimeMillis :
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOriginalDuration - (time - mStartTimeMillis));
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransitionState = TRANSITION_STARTING;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas) {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean done = true;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (mTransitionState) {
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case TRANSITION_STARTING:
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartTimeMillis = SystemClock.uptimeMillis();
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                done = false;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTransitionState = TRANSITION_RUNNING;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case TRANSITION_RUNNING:
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mStartTimeMillis >= 0) {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float normalized = (float)
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            (SystemClock.uptimeMillis() - mStartTimeMillis) / mDuration;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    done = normalized >= 1.0f;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    normalized = Math.min(normalized, 1.0f);
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAlpha = (int) (mFrom  + (mTo - mFrom) * normalized);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
186b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int alpha = mAlpha;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean crossFade = mCrossFade;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ChildDrawable[] array = mLayerState.mChildren;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
191ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase        if (done) {
192ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase            // the setAlpha() calls below trigger invalidation and redraw. If we're done, just draw
193ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase            // the appropriate drawable[s] and return
194ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase            if (!crossFade || alpha == 0) {
195ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase                array[0].mDrawable.draw(canvas);
196ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase            }
197ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase            if (alpha == 0xFF) {
198ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase                array[1].mDrawable.draw(canvas);
199ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase            }
200ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase            return;
201ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase        }
202ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase
203ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase        Drawable d;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        d = array[0].mDrawable;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (crossFade) {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.setAlpha(255 - alpha);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        d.draw(canvas);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (crossFade) {
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.setAlpha(0xFF);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (alpha > 0) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d = array[1].mDrawable;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.setAlpha(alpha);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.draw(canvas);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.setAlpha(0xFF);
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
219b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!done) {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            invalidateSelf();
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Enables or disables the cross fade of the drawables. When cross fade
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is disabled, the first drawable is always drawn opaque. With cross
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * fade enabled, the first drawable is drawn with the opposite alpha of
229dfe5c204403bc56c29bb36410574eab8b1950417Scott Main     * the second drawable. Cross fade is disabled by default.
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param enabled True to enable cross fading, false otherwise.
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCrossFadeEnabled(boolean enabled) {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCrossFade = enabled;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether the cross fade is enabled for this transition.
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if cross fading is enabled, false otherwise.
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isCrossFadeEnabled() {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCrossFade;
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class TransitionState extends LayerState {
24717cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette        TransitionState(TransitionState orig, TransitionDrawable owner, Resources res) {
248c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn            super(orig, owner, res);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Drawable newDrawable() {
25317cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette            return new TransitionDrawable(this, (Resources) null);
254c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        }
255c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn
256c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        @Override
257c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        public Drawable newDrawable(Resources res) {
25817cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette            return new TransitionDrawable(this, res);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getChangingConfigurations() {
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mChangingConfigurations;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
267