DrawableContainer.java revision 1557fd7809078e421f751efc7d2539b3efdc54b2
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics.drawable; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19c2974809373697147cbe5754835cc871fb93aef1Dianne Hackbornimport android.content.res.Resources; 2078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Canvas; 2178aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.ColorFilter; 2278aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PixelFormat; 2378aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Rect; 24079e23575024e103358c982152afb7a720ae1a8aDianne Hackbornimport android.os.SystemClock; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne/** 2778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * A helper class that contains several {@link Drawable}s and selects which one to use. 2878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * 2978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * You can subclass it to create your own DrawableContainers or directly use one its child classes. 3078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne */ 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DrawableContainer extends Drawable implements Drawable.Callback { 32079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private static final boolean DEBUG = false; 33079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private static final String TAG = "DrawableContainer"; 34211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed 35211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed /** 36211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * To be proper, we should have a getter for dither (and alpha, etc.) 37211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * so that proxy classes like this can save/restore their delegates' 38211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * values, but we don't have getters. Since we do have setters 39211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * (e.g. setDither), which this proxy forwards on, we have to have some 40211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * default/initial setting. 41211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * 42211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * The initial setting for dither is now true, since it almost always seems 43211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed * to improve the quality at negligible cost. 44211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed */ 45211db4a2874f1a2d0e7a8cb8d33e81fa08801763Mike Reed private static final boolean DEFAULT_DITHER = true; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private DrawableContainerState mDrawableContainerState; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mCurrDrawable; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mAlpha = 0xFF; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ColorFilter mColorFilter; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCurIndex = -1; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mMutated; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn // Animations. 55079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private Runnable mAnimationRunnable; 56079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private long mEnterAnimationEnd; 57079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private long mExitAnimationEnd; 58079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn private Drawable mLastDrawable; 59079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // overrides from Drawable 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void draw(Canvas canvas) { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.draw(canvas); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 68079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.draw(canvas); 69079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getChangingConfigurations() { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.getChangingConfigurations() 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | mDrawableContainerState.mChangingConfigurations 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | mDrawableContainerState.mChildrenChangingConfigurations; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getPadding(Rect padding) { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect r = mDrawableContainerState.getConstantPadding(); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r != null) { 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project padding.set(r); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable.getPadding(padding); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.getPadding(padding); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 931557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne /** 941557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne * @hide 951557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne */ 961557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne @Override 971557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne public boolean getLayoutInsets(Rect insets) { 981557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne if (mCurrDrawable != null) { 991557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne return mCurrDrawable.getLayoutInsets(insets); 1001557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne } else { 1011557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne return super.getLayoutInsets(insets); 1021557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne } 1031557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne } 1041557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAlpha(int alpha) { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAlpha != alpha) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlpha = alpha; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 110079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd == 0) { 111079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mCurrDrawable.setAlpha(alpha); 112079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 113079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(false); 114079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDither(boolean dither) { 121a41581ed4033004c73115113f45b9844e9b0210fRomain Guy if (mDrawableContainerState.mDither != dither) { 122a41581ed4033004c73115113f45b9844e9b0210fRomain Guy mDrawableContainerState.mDither = dither; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 124a41581ed4033004c73115113f45b9844e9b0210fRomain Guy mCurrDrawable.setDither(mDrawableContainerState.mDither); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setColorFilter(ColorFilter cf) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mColorFilter != cf) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mColorFilter = cf; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.setColorFilter(cf); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn /** 140079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * Change the global fade duration when a new drawable is entering 141079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * the scene. 142079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * @param ms The amount of time to fade in milliseconds. 143079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn */ 144079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void setEnterFadeDuration(int ms) { 145079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mDrawableContainerState.mEnterFadeDuration = ms; 146079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 147079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 148079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn /** 149079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * Change the global fade duration when a new drawable is leaving 150079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * the scene. 151079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * @param ms The amount of time to fade in milliseconds. 152079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn */ 153079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void setExitFadeDuration(int ms) { 154079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mDrawableContainerState.mExitFadeDuration = ms; 155079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 156079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onBoundsChange(Rect bounds) { 159079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 160079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setBounds(bounds); 161079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.setBounds(bounds); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isStateful() { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.isStateful(); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 173079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void jumpToCurrentState() { 174079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn boolean changed = false; 175079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 176079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.jumpToCurrentState(); 177079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 178079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 179079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 180079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mCurrDrawable != null) { 181079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mCurrDrawable.jumpToCurrentState(); 182a0ac98bd5cb550319221c1d60277e07a9d2e3a91Jeff Sharkey mCurrDrawable.setAlpha(mAlpha); 183079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 184079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd != 0) { 185079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 186079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 187079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 188079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0) { 189079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 190079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn changed = true; 191079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 192079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (changed) { 193079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn invalidateSelf(); 194079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 195079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 196079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 197079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn @Override 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean onStateChange(int[] state) { 199079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 200079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mLastDrawable.setState(state); 201079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable.setState(state); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean onLevelChange(int level) { 210079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 211079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mLastDrawable.setLevel(level); 212079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable.setLevel(level); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicWidth() { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantWidth(); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getIntrinsicWidth() : -1; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicHeight() { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantHeight(); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getIntrinsicHeight() : -1; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinimumWidth() { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantMinimumWidth(); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getMinimumWidth() : 0; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinimumHeight() { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.isConstantSize()) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState.getConstantMinimumHeight(); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable != null ? mCurrDrawable.getMinimumHeight() : 0; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 251079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void invalidateDrawable(Drawable who) { 252f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 253f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().invalidateDrawable(this); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 257079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void scheduleDrawable(Drawable who, Runnable what, long when) { 258f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 259f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().scheduleDrawable(this, what, when); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 263079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void unscheduleDrawable(Drawable who, Runnable what) { 264f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (who == mCurrDrawable && getCallback() != null) { 265f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy getCallback().unscheduleDrawable(this, what); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setVisible(boolean visible, boolean restart) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = super.setVisible(visible, restart); 272079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 273079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(visible, restart); 274079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable.setVisible(visible, restart); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return changed; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOpacity() { 28383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy return mCurrDrawable == null || !mCurrDrawable.isVisible() ? PixelFormat.TRANSPARENT : 28483b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy mDrawableContainerState.getOpacity(); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne public boolean selectDrawable(int idx) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idx == mCurIndex) { 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 291079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 292079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn final long now = SystemClock.uptimeMillis(); 293079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 294079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (DEBUG) android.util.Log.i(TAG, toString() + " from " + mCurIndex + " to " + idx 295079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn + ": exit=" + mDrawableContainerState.mExitFadeDuration 296079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn + " enter=" + mDrawableContainerState.mEnterFadeDuration); 297079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 298079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mDrawableContainerState.mExitFadeDuration > 0) { 299079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 300079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(false, false); 301079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrDrawable != null) { 303079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = mCurrDrawable; 304079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = now + mDrawableContainerState.mExitFadeDuration; 305079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 306079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 307079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 309079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else if (mCurrDrawable != null) { 310079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mCurrDrawable.setVisible(false, false); 311079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 312079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 313079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (idx >= 0 && idx < mDrawableContainerState.mNumChildren) { 314079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn Drawable d = mDrawableContainerState.mDrawables[idx]; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable = d; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurIndex = idx; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 318079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mDrawableContainerState.mEnterFadeDuration > 0) { 319079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = now + mDrawableContainerState.mEnterFadeDuration; 320079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 321079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn d.setAlpha(mAlpha); 322079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setVisible(isVisible(), true); 324a41581ed4033004c73115113f45b9844e9b0210fRomain Guy d.setDither(mDrawableContainerState.mDither); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setColorFilter(mColorFilter); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setState(getState()); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setLevel(getLevel()); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setBounds(getBounds()); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrDrawable = null; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurIndex = -1; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 334079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 335079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0 || mExitAnimationEnd != 0) { 336079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mAnimationRunnable == null) { 337079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mAnimationRunnable = new Runnable() { 338079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn @Override public void run() { 339079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(true); 340079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn invalidateSelf(); 341079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 342079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn }; 343079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 344079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn unscheduleSelf(mAnimationRunnable); 345079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 346079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn // Compute first frame and schedule next animation. 347079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animate(true); 348079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 349079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidateSelf(); 351079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 355079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn void animate(boolean schedule) { 356079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn final long now = SystemClock.uptimeMillis(); 357079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn boolean animating = false; 358079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mCurrDrawable != null) { 359079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd != 0) { 360079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mEnterAnimationEnd <= now) { 361079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mCurrDrawable.setAlpha(mAlpha); 362079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 363079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 364079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn int animAlpha = (int)((mEnterAnimationEnd-now)*255) 365079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn / mDrawableContainerState.mEnterFadeDuration; 366079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (DEBUG) android.util.Log.i(TAG, toString() + " cur alpha " + animAlpha); 367079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mCurrDrawable.setAlpha(((255-animAlpha)*mAlpha)/255); 368079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animating = true; 369079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 370079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 371079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 372079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterAnimationEnd = 0; 373079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 374079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mLastDrawable != null) { 375079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd != 0) { 376079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (mExitAnimationEnd <= now) { 377079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setVisible(false, false); 378079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable = null; 379079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 380079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 381079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn int animAlpha = (int)((mExitAnimationEnd-now)*255) 382079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn / mDrawableContainerState.mExitFadeDuration; 383079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (DEBUG) android.util.Log.i(TAG, toString() + " last alpha " + animAlpha); 384079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mLastDrawable.setAlpha((animAlpha*mAlpha)/255); 385079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn animating = true; 386079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 387079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 388079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } else { 389079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitAnimationEnd = 0; 390079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 391079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 392079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn if (schedule && animating) { 393079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn scheduleSelf(mAnimationRunnable, now + 1000/60); 394079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 395079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 396079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getCurrent() { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrDrawable; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ConstantState getConstantState() { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawableContainerState.canConstantState()) { 4056efd2bad954e0e5bd74916a32f036a0f149dcd4dChristopher Lais mDrawableContainerState.mChangingConfigurations = getChangingConfigurations(); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawableContainerState; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable mutate() { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mMutated && super.mutate() == this) { 4146be507cc66863a08f08d6c0675e5bc11e5a45d32Phil Dubach final int N = mDrawableContainerState.getChildCount(); 4156be507cc66863a08f08d6c0675e5bc11e5a45d32Phil Dubach final Drawable[] drawables = mDrawableContainerState.getChildren(); 4166be507cc66863a08f08d6c0675e5bc11e5a45d32Phil Dubach for (int i = 0; i < N; i++) { 4171010ac9b7c52b1e2a64e8e1f4dcdb4d79f4d32ccRomain Guy if (drawables[i] != null) drawables[i].mutate(); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMutated = true; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne /** 42578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * A ConstantState that can contain several {@link Drawable}s. 42678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * 42778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * This class was made public to enable testing, and its visibility may change in a future 42878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne * release. 42978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne */ 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract static class DrawableContainerState extends ConstantState { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final DrawableContainer mOwner; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mChangingConfigurations; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mChildrenChangingConfigurations; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable[] mDrawables; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mNumChildren; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mVariablePadding = false; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect mConstantPadding = null; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mConstantSize = false; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mComputedConstantSize = false; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mConstantWidth; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mConstantHeight; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mConstantMinimumWidth; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mConstantMinimumHeight; 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mHaveOpacity = false; 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mOpacity; 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mHaveStateful = false; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mStateful; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mCheckedConstantState; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mCanConstantState; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4585140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy boolean mPaddingChecked = false; 459a41581ed4033004c73115113f45b9844e9b0210fRomain Guy 460a41581ed4033004c73115113f45b9844e9b0210fRomain Guy boolean mDither = DEFAULT_DITHER; 4615140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy 462079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn int mEnterFadeDuration; 463079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn int mExitFadeDuration; 464079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 465c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn DrawableContainerState(DrawableContainerState orig, DrawableContainer owner, 466c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn Resources res) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwner = owner; 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (orig != null) { 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChangingConfigurations = orig.mChangingConfigurations; 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenChangingConfigurations = orig.mChildrenChangingConfigurations; 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Drawable[] origDr = orig.mDrawables; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables = new Drawable[origDr.length]; 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumChildren = orig.mNumChildren; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mNumChildren; 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 480c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn if (res != null) { 481c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn mDrawables[i] = origDr[i].getConstantState().newDrawable(res); 482c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn } else { 483c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn mDrawables[i] = origDr[i].getConstantState().newDrawable(); 484c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables[i].setCallback(owner); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckedConstantState = mCanConstantState = true; 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVariablePadding = orig.mVariablePadding; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (orig.mConstantPadding != null) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantPadding = new Rect(orig.mConstantPadding); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantSize = orig.mConstantSize; 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mComputedConstantSize = orig.mComputedConstantSize; 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantWidth = orig.mConstantWidth; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantHeight = orig.mConstantHeight; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveOpacity = orig.mHaveOpacity; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpacity = orig.mOpacity; 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveStateful = orig.mHaveStateful; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStateful = orig.mStateful; 502a41581ed4033004c73115113f45b9844e9b0210fRomain Guy 503a41581ed4033004c73115113f45b9844e9b0210fRomain Guy mDither = orig.mDither; 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 505079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterFadeDuration = orig.mEnterFadeDuration; 506079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitFadeDuration = orig.mExitFadeDuration; 507079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables = new Drawable[10]; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumChildren = 0; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckedConstantState = mCanConstantState = false; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getChangingConfigurations() { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mChangingConfigurations; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int addChild(Drawable dr) { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int pos = mNumChildren; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= mDrawables.length) { 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project growArray(pos, pos+10); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dr.setVisible(false, true); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dr.setCallback(mOwner); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables[pos] = dr; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumChildren++; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenChangingConfigurations |= dr.getChangingConfigurations(); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveOpacity = false; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveStateful = false; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantPadding = null; 5375140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy mPaddingChecked = false; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mComputedConstantSize = false; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pos; 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54383b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getChildCount() { 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNumChildren; 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final Drawable[] getChildren() { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDrawables; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** A boolean value indicating whether to use the maximum padding value of 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * all frames in the set (false), or to use the padding value of the frame 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * being shown (true). Default value is false. 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 55583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final void setVariablePadding(boolean variable) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVariablePadding = variable; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final Rect getConstantPadding() { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mVariablePadding) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5635140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy if (mConstantPadding != null || mPaddingChecked) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantPadding; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5675140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy Rect r = null; 56883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Rect t = new Rect(); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = getChildCount(); 57083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 57183b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 0; i < N; i++) { 57283b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy if (drawables[i].getPadding(t)) { 5735140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy if (r == null) r = new Rect(0, 0, 0, 0); 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.left > r.left) r.left = t.left; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.top > r.top) r.top = t.top; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.right > r.right) r.right = t.right; 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.bottom > r.bottom) r.bottom = t.bottom; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5805140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy mPaddingChecked = true; 5815140141c2637b89ad0d86c3b715459a1e7b92729Romain Guy return (mConstantPadding = r); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58483b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final void setConstantSize(boolean constant) { 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantSize = constant; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final boolean isConstantSize() { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantSize; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 59283b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantWidth() { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mComputedConstantSize) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantWidth; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 60083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantHeight() { 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mComputedConstantSize) { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantHeight; 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 60883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantMinimumWidth() { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mComputedConstantSize) { 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantMinimumWidth; 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 61683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getConstantMinimumHeight() { 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mComputedConstantSize) { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeConstantSize(); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstantMinimumHeight; 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne protected void computeConstantSize() { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mComputedConstantSize = true; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = getChildCount(); 62883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 62978aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne mConstantWidth = mConstantHeight = -1; 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstantMinimumWidth = mConstantMinimumHeight = 0; 63183b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 0; i < N; i++) { 63283b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy Drawable dr = drawables[i]; 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int s = dr.getIntrinsicWidth(); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantWidth) mConstantWidth = s; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getIntrinsicHeight(); 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantHeight) mConstantHeight = s; 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getMinimumWidth(); 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantMinimumWidth) mConstantMinimumWidth = s; 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dr.getMinimumHeight(); 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > mConstantMinimumHeight) mConstantMinimumHeight = s; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 644079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final void setEnterFadeDuration(int duration) { 645079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mEnterFadeDuration = duration; 646079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 647079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 648079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final int getEnterFadeDuration() { 649079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mEnterFadeDuration; 650079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 651079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 652079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final void setExitFadeDuration(int duration) { 653079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn mExitFadeDuration = duration; 654079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 655079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 656079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public final int getExitFadeDuration() { 657079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn return mExitFadeDuration; 658079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 659079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 66083b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public final int getOpacity() { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHaveOpacity) { 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOpacity; 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = getChildCount(); 66683b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy final Drawable[] drawables = mDrawables; 66783b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy int op = N > 0 ? drawables[0].getOpacity() : PixelFormat.TRANSPARENT; 66883b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy for (int i = 1; i < N; i++) { 66983b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy op = Drawable.resolveOpacity(op, drawables[i].getOpacity()); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpacity = op; 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveOpacity = true; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return op; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isStateful() { 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHaveStateful) { 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStateful; 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean stateful = false; 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = getChildCount(); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawables[i].isStateful()) { 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateful = true; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStateful = stateful; 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveStateful = true; 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return stateful; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy public void growArray(int oldSize, int newSize) { 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable[] newDrawables = new Drawable[newSize]; 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(mDrawables, 0, newDrawables, 0, oldSize); 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawables = newDrawables; 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized boolean canConstantState() { 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mCheckedConstantState) { 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCanConstantState = true; 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mNumChildren; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDrawables[i].getConstantState() == null) { 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCanConstantState = false; 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckedConstantState = true; 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCanConstantState; 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void setConstantState(DrawableContainerState state) 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawableContainerState = state; 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 723