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><transition></code> element. 30dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * Each Drawable in the transition is defined in a nested <code><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