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