package org.holoeverywhere.drawable; import java.io.IOException; import com.actionbarsherlock.R; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import android.util.AttributeSet; public class ColorDrawable extends android.graphics.drawable.ColorDrawable { final static class ColorState extends ConstantState { int mBaseColor; int mChangingConfigurations; int mUseColor; ColorState(ColorState state) { if (state != null) { mBaseColor = state.mBaseColor; mUseColor = state.mUseColor; } } @Override public int getChangingConfigurations() { return mChangingConfigurations; } @Override public Drawable newDrawable() { return new ColorDrawable(this); } @Override public Drawable newDrawable(Resources res) { return new ColorDrawable(this); } } private final Paint mPaint = new Paint(); private ColorState mState; public ColorDrawable() { this(null); } private ColorDrawable(ColorState state) { mState = new ColorState(state); } public ColorDrawable(int color) { this(null); setColor(color); } @Override public void draw(Canvas canvas) { if (mState.mUseColor >>> 24 != 0) { mPaint.setColor(mState.mUseColor); canvas.drawRect(getBounds(), mPaint); } } @Override public int getAlpha() { return mState.mUseColor >>> 24; } @Override public int getChangingConfigurations() { return super.getChangingConfigurations() | mState.mChangingConfigurations; } @Override public int getColor() { return mState.mUseColor; } @Override public ConstantState getConstantState() { mState.mChangingConfigurations = getChangingConfigurations(); return mState; } @Override public int getOpacity() { switch (mState.mUseColor >>> 24) { case 255: return PixelFormat.OPAQUE; case 0: return PixelFormat.TRANSPARENT; } return PixelFormat.TRANSLUCENT; } @Override public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs) throws XmlPullParserException, IOException { super.inflate(r, parser, attrs); TypedArray a = r.obtainAttributes(attrs, R.styleable.ColorDrawable); int color = mState.mBaseColor; color = a.getColor(R.styleable.ColorDrawable_android_color, color); mState.mBaseColor = mState.mUseColor = color; a.recycle(); } @Override public void setAlpha(int alpha) { alpha += alpha >> 7; int baseAlpha = mState.mBaseColor >>> 24; int useAlpha = baseAlpha * alpha >> 8; int oldUseColor = mState.mUseColor; mState.mUseColor = mState.mBaseColor << 8 >>> 8 | useAlpha << 24; if (oldUseColor != mState.mUseColor) { invalidateSelf(); } } @Override public void setColor(int color) { if (mState.mBaseColor != color || mState.mUseColor != color) { invalidateSelf(); mState.mBaseColor = mState.mUseColor = color; } } @Override public void setColorFilter(ColorFilter colorFilter) { } }