From b1af7f3d4be6cd6bc6e1e805f22c209e19bf928f Mon Sep 17 00:00:00 2001 From: Chet Haase Date: Fri, 8 Mar 2013 14:02:04 -0800 Subject: [PATCH] add getAlpha() to Drawable Drawable has setAlpha(int), but no getAlpha() (although some subclasses have added the method). This makes it more tedious to use the property. For example, animations that wish to animate this property must explicitly give it a start value since this value cannot be queried from the object. The trick is that setAlpha(int) is abstract, only implemented by subclasses. We cannot take this approach for getAlpha(), as we would break all subclasses of Drawable until they implemented the method. Instead, we'll add a default method which returns an invalid value, making it easier for clients of the method to detect whether the value is valid. All subclasses of Drawble in frameworks have been changed to add an override of getAlpha() when appropriate. Issue #7485875 Drawables is missing getAlpha() Change-Id: I06b6e35f1a56d202838eca44759c85c82595020a --- api/current.txt | 2 +- .../android/widget/ScrollBarDrawable.java | 6 ++++ .../widget/multiwaveview/TargetDrawable.java | 30 ------------------- .../drawable/AnimatedRotateDrawable.java | 5 ++++ .../graphics/drawable/BitmapDrawable.java | 5 ++++ .../graphics/drawable/ClipDrawable.java | 5 ++++ .../graphics/drawable/ColorDrawable.java | 1 + .../android/graphics/drawable/Drawable.java | 11 +++++++ .../graphics/drawable/DrawableContainer.java | 5 ++++ .../graphics/drawable/GradientDrawable.java | 5 ++++ .../graphics/drawable/InsetDrawable.java | 7 ++++- .../graphics/drawable/LayerDrawable.java | 13 +++++++- .../graphics/drawable/NinePatchDrawable.java | 9 ++++++ .../graphics/drawable/RotateDrawable.java | 5 ++++ .../graphics/drawable/ScaleDrawable.java | 5 ++++ .../graphics/drawable/ShapeDrawable.java | 7 ++++- .../statusbar/policy/FixedSizeDrawable.java | 4 +++ 17 files changed, 91 insertions(+), 34 deletions(-) diff --git a/api/current.txt b/api/current.txt index 9431ba2db7a9b..247fe68c76968 100644 --- a/api/current.txt +++ b/api/current.txt @@ -9442,7 +9442,6 @@ package android.graphics.drawable { ctor public ColorDrawable(); ctor public ColorDrawable(int); method public void draw(android.graphics.Canvas); - method public int getAlpha(); method public int getColor(); method public int getOpacity(); method public void setAlpha(int); @@ -9462,6 +9461,7 @@ package android.graphics.drawable { method public static android.graphics.drawable.Drawable createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public static android.graphics.drawable.Drawable createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public abstract void draw(android.graphics.Canvas); + method public int getAlpha(); method public final android.graphics.Rect getBounds(); method public android.graphics.drawable.Drawable.Callback getCallback(); method public int getChangingConfigurations(); diff --git a/core/java/android/widget/ScrollBarDrawable.java b/core/java/android/widget/ScrollBarDrawable.java index 93a1179c8c0da..9886bc37bc0b2 100644 --- a/core/java/android/widget/ScrollBarDrawable.java +++ b/core/java/android/widget/ScrollBarDrawable.java @@ -225,6 +225,12 @@ public class ScrollBarDrawable extends Drawable { mHorizontalThumb.setAlpha(alpha); } + @Override + public int getAlpha() { + // All elements should have same alpha, just return one of them + return mVerticalThumb.getAlpha(); + } + @Override public void setColorFilter(ColorFilter cf) { if (mVerticalTrack != null) { diff --git a/core/java/com/android/internal/widget/multiwaveview/TargetDrawable.java b/core/java/com/android/internal/widget/multiwaveview/TargetDrawable.java index 30f5f2f2ddee8..16bec160c5698 100644 --- a/core/java/com/android/internal/widget/multiwaveview/TargetDrawable.java +++ b/core/java/com/android/internal/widget/multiwaveview/TargetDrawable.java @@ -46,36 +46,6 @@ public class TargetDrawable { private boolean mEnabled = true; private final int mResourceId; - /* package */ static class DrawableWithAlpha extends Drawable { - private float mAlpha = 1.0f; - private Drawable mRealDrawable; - public DrawableWithAlpha(Drawable realDrawable) { - mRealDrawable = realDrawable; - } - public void setAlpha(float alpha) { - mAlpha = alpha; - } - public float getAlpha() { - return mAlpha; - } - public void draw(Canvas canvas) { - mRealDrawable.setAlpha((int) Math.round(mAlpha * 255f)); - mRealDrawable.draw(canvas); - } - @Override - public void setAlpha(int alpha) { - mRealDrawable.setAlpha(alpha); - } - @Override - public void setColorFilter(ColorFilter cf) { - mRealDrawable.setColorFilter(cf); - } - @Override - public int getOpacity() { - return mRealDrawable.getOpacity(); - } - } - public TargetDrawable(Resources res, int resId) { mResourceId = resId; setDrawable(res, resId); diff --git a/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java b/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java index 34f90708afeec..9042ce622845e 100644 --- a/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java @@ -152,6 +152,11 @@ public class AnimatedRotateDrawable extends Drawable implements Drawable.Callbac mState.mDrawable.setAlpha(alpha); } + @Override + public int getAlpha() { + return mState.mDrawable.getAlpha(); + } + @Override public void setColorFilter(ColorFilter cf) { mState.mDrawable.setColorFilter(cf); diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java index 675c4b6bceb01..41765b3023d66 100644 --- a/graphics/java/android/graphics/drawable/BitmapDrawable.java +++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java @@ -455,6 +455,11 @@ public class BitmapDrawable extends Drawable { } } + @Override + public int getAlpha() { + return mBitmapState.mPaint.getAlpha(); + } + @Override public void setColorFilter(ColorFilter cf) { mBitmapState.mPaint.setColorFilter(cf); diff --git a/graphics/java/android/graphics/drawable/ClipDrawable.java b/graphics/java/android/graphics/drawable/ClipDrawable.java index b7429d412e6fe..dcfe20f77165c 100644 --- a/graphics/java/android/graphics/drawable/ClipDrawable.java +++ b/graphics/java/android/graphics/drawable/ClipDrawable.java @@ -157,6 +157,11 @@ public class ClipDrawable extends Drawable implements Drawable.Callback { mClipState.mDrawable.setAlpha(alpha); } + @Override + public int getAlpha() { + return mClipState.mDrawable.getAlpha(); + } + @Override public void setColorFilter(ColorFilter cf) { mClipState.mDrawable.setColorFilter(cf); diff --git a/graphics/java/android/graphics/drawable/ColorDrawable.java b/graphics/java/android/graphics/drawable/ColorDrawable.java index d11e554053937..61dd675d08f3b 100644 --- a/graphics/java/android/graphics/drawable/ColorDrawable.java +++ b/graphics/java/android/graphics/drawable/ColorDrawable.java @@ -116,6 +116,7 @@ public class ColorDrawable extends Drawable { * * @return A value between 0 and 255. */ + @Override public int getAlpha() { return mState.mUseColor >>> 24; } diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index 37f2250658f6a..67dc4d6759db1 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -405,6 +405,17 @@ public abstract class Drawable { */ public abstract void setAlpha(int alpha); + /** + * Gets the current alpha value for the drawable. 0 means fully transparent, + * 255 means fully opaque. This method is implemented by + * Drawable subclasses and the value returned is specific to how that class treats alpha. + * The default return value is 255 if the class does not override this method to return a value + * specific to its use of alpha. + */ + public int getAlpha() { + return 0xFF; + } + /** * Specify an optional colorFilter for the drawable. Pass null to remove * any filters. diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java index a0c97012e3978..07c25c4714975 100644 --- a/graphics/java/android/graphics/drawable/DrawableContainer.java +++ b/graphics/java/android/graphics/drawable/DrawableContainer.java @@ -113,6 +113,11 @@ public class DrawableContainer extends Drawable implements Drawable.Callback { } } + @Override + public int getAlpha() { + return mAlpha; + } + @Override public void setDither(boolean dither) { if (mDrawableContainerState.mDither != dither) { diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java index b966bb461135e..d226c8c707776 100644 --- a/graphics/java/android/graphics/drawable/GradientDrawable.java +++ b/graphics/java/android/graphics/drawable/GradientDrawable.java @@ -638,6 +638,11 @@ public class GradientDrawable extends Drawable { } } + @Override + public int getAlpha() { + return mAlpha; + } + @Override public void setDither(boolean dither) { if (dither != mDither) { diff --git a/graphics/java/android/graphics/drawable/InsetDrawable.java b/graphics/java/android/graphics/drawable/InsetDrawable.java index 231234cf4ee73..1507a9b255763 100644 --- a/graphics/java/android/graphics/drawable/InsetDrawable.java +++ b/graphics/java/android/graphics/drawable/InsetDrawable.java @@ -192,7 +192,12 @@ public class InsetDrawable extends Drawable implements Drawable.Callback public void setAlpha(int alpha) { mInsetState.mDrawable.setAlpha(alpha); } - + + @Override + public int getAlpha() { + return mInsetState.mDrawable.getAlpha(); + } + @Override public void setColorFilter(ColorFilter cf) { mInsetState.mDrawable.setColorFilter(cf); diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java index dd692c68ec7e9..dfbd9864375ac 100644 --- a/graphics/java/android/graphics/drawable/LayerDrawable.java +++ b/graphics/java/android/graphics/drawable/LayerDrawable.java @@ -402,7 +402,18 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { array[i].mDrawable.setAlpha(alpha); } } - + + @Override + public int getAlpha() { + final ChildDrawable[] array = mLayerState.mChildren; + if (mLayerState.mNum > 0) { + // All layers should have the same alpha set on them - just return the first one + return array[0].mDrawable.getAlpha(); + } else { + return super.getAlpha(); + } + } + @Override public void setColorFilter(ColorFilter cf) { final ChildDrawable[] array = mLayerState.mChildren; diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java index a9dc22b34efce..8429e241a45e6 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -250,6 +250,15 @@ public class NinePatchDrawable extends Drawable { invalidateSelf(); } + @Override + public int getAlpha() { + if (mPaint == null) { + // Fast common case -- normal alpha. + return 0xFF; + } + return getPaint().getAlpha(); + } + @Override public void setColorFilter(ColorFilter cf) { if (mPaint == null && cf == null) { diff --git a/graphics/java/android/graphics/drawable/RotateDrawable.java b/graphics/java/android/graphics/drawable/RotateDrawable.java index e987679dd49fe..7cbc7370a0856 100644 --- a/graphics/java/android/graphics/drawable/RotateDrawable.java +++ b/graphics/java/android/graphics/drawable/RotateDrawable.java @@ -108,6 +108,11 @@ public class RotateDrawable extends Drawable implements Drawable.Callback { mState.mDrawable.setAlpha(alpha); } + @Override + public int getAlpha() { + return mState.mDrawable.getAlpha(); + } + public void setColorFilter(ColorFilter cf) { mState.mDrawable.setColorFilter(cf); } diff --git a/graphics/java/android/graphics/drawable/ScaleDrawable.java b/graphics/java/android/graphics/drawable/ScaleDrawable.java index bd2b2f0624a4b..8a28b2b3a1143 100644 --- a/graphics/java/android/graphics/drawable/ScaleDrawable.java +++ b/graphics/java/android/graphics/drawable/ScaleDrawable.java @@ -176,6 +176,11 @@ public class ScaleDrawable extends Drawable implements Drawable.Callback { mScaleState.mDrawable.setAlpha(alpha); } + @Override + public int getAlpha() { + return mScaleState.mDrawable.getAlpha(); + } + @Override public void setColorFilter(ColorFilter cf) { mScaleState.mDrawable.setColorFilter(cf); diff --git a/graphics/java/android/graphics/drawable/ShapeDrawable.java b/graphics/java/android/graphics/drawable/ShapeDrawable.java index 1dbcddbf63aef..93f2dc603ee98 100644 --- a/graphics/java/android/graphics/drawable/ShapeDrawable.java +++ b/graphics/java/android/graphics/drawable/ShapeDrawable.java @@ -252,7 +252,12 @@ public class ShapeDrawable extends Drawable { mShapeState.mAlpha = alpha; invalidateSelf(); } - + + @Override + public int getAlpha() { + return mShapeState.mAlpha; + } + @Override public void setColorFilter(ColorFilter cf) { mShapeState.mPaint.setColorFilter(cf); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FixedSizeDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FixedSizeDrawable.java index 8f2f5f9e7e7ab..0e8095c1be00e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FixedSizeDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FixedSizeDrawable.java @@ -60,6 +60,10 @@ public class FixedSizeDrawable extends Drawable { mDrawable.setAlpha(alpha); } + public int getAlpha() { + return mDrawable.getAlpha(); + } + public void setColorFilter(ColorFilter cf) { mDrawable.setColorFilter(cf); }