diff options
author | Mark Wei <markwei@google.com> | 2014-03-02 19:25:41 -0800 |
---|---|---|
committer | Mark Wei <markwei@google.com> | 2014-03-02 19:25:41 -0800 |
commit | 09f46006437e7de33afdb51192bf0bdc08e97040 (patch) | |
tree | 1398af7f562bc676f9efc5275cd926a04955590c /src/com/android/bitmap/drawable | |
parent | ad97cd0e0753930ec68f189e6be1023dc0f62f75 (diff) | |
download | bitmap-09f46006437e7de33afdb51192bf0bdc08e97040.tar.gz |
CircularBitmapDrawable is now an ExtendedBitmapDrawable. Avatars can now fade in!
Change-Id: I79fae35f0949a17309bce0cffd6b10e7e6d8db2c
Diffstat (limited to 'src/com/android/bitmap/drawable')
3 files changed, 40 insertions, 7 deletions
diff --git a/src/com/android/bitmap/drawable/CircularBitmapDrawable.java b/src/com/android/bitmap/drawable/CircularBitmapDrawable.java index 32eb460..878cb6b 100644 --- a/src/com/android/bitmap/drawable/CircularBitmapDrawable.java +++ b/src/com/android/bitmap/drawable/CircularBitmapDrawable.java @@ -27,6 +27,7 @@ import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Rect; import android.graphics.Shader.TileMode; +import android.graphics.drawable.BitmapDrawable; import com.android.bitmap.BitmapCache; @@ -35,7 +36,7 @@ import com.android.bitmap.BitmapCache; * * This draws all bitmaps as a circle with an optional border stroke. */ -public class CircularBitmapDrawable extends BasicBitmapDrawable { +public class CircularBitmapDrawable extends ExtendedBitmapDrawable { private static Matrix sMatrix = new Matrix(); private final Paint mBitmapPaint = new Paint(); @@ -45,7 +46,12 @@ public class CircularBitmapDrawable extends BasicBitmapDrawable { public CircularBitmapDrawable(Resources res, BitmapCache cache, boolean limitDensity) { - super(res, cache, limitDensity); + this(res, cache, limitDensity, null); + } + + public CircularBitmapDrawable(Resources res, + BitmapCache cache, boolean limitDensity, ExtendedOptions opts) { + super(res, cache, limitDensity, opts); mBitmapPaint.setAntiAlias(true); mBitmapPaint.setFilterBitmap(true); @@ -85,7 +91,17 @@ public class CircularBitmapDrawable extends BasicBitmapDrawable { @Override protected void onDrawBitmap(final Canvas canvas, final Rect src, final Rect dst) { - onDrawCircularBitmap(getBitmap().bmp, canvas, src, dst); + onDrawCircularBitmap(getBitmap().bmp, canvas, src, dst, 1f); + } + + @Override + protected void onDrawPlaceholderOrProgress(final Canvas canvas, + final TileDrawable drawable) { + BitmapDrawable placeholder = (BitmapDrawable) drawable.getInnerDrawable(); + Bitmap bitmap = placeholder.getBitmap(); + float alpha = placeholder.getPaint().getAlpha() / 255f; + sRect.set(0, 0, bitmap.getWidth(), bitmap.getHeight()); + onDrawCircularBitmap(bitmap, canvas, sRect, getBounds(), alpha); } /** @@ -93,7 +109,7 @@ public class CircularBitmapDrawable extends BasicBitmapDrawable { * BitmapShader. */ protected void onDrawCircularBitmap(final Bitmap bitmap, final Canvas canvas, - final Rect src, final Rect dst) { + final Rect src, final Rect dst, final float alpha) { // Draw bitmap through shader first. BitmapShader shader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP); @@ -109,8 +125,11 @@ public class CircularBitmapDrawable extends BasicBitmapDrawable { shader.setLocalMatrix(sMatrix); mBitmapPaint.setShader(shader); + int oldAlpha = mBitmapPaint.getAlpha(); + mBitmapPaint.setAlpha((int) (oldAlpha * alpha)); canvas.drawCircle(dst.centerX(), dst.centerY(), dst.width() / 2, mBitmapPaint); + mBitmapPaint.setAlpha(oldAlpha); // Then draw the border. canvas.drawCircle(dst.centerX(), dst.centerY(), diff --git a/src/com/android/bitmap/drawable/ExtendedBitmapDrawable.java b/src/com/android/bitmap/drawable/ExtendedBitmapDrawable.java index b6093e7..0e01142 100644 --- a/src/com/android/bitmap/drawable/ExtendedBitmapDrawable.java +++ b/src/com/android/bitmap/drawable/ExtendedBitmapDrawable.java @@ -71,9 +71,12 @@ public class ExtendedBitmapDrawable extends BasicBitmapDrawable implements private final Handler mHandler = new Handler(); public ExtendedBitmapDrawable(final Resources res, final BitmapCache cache, - final boolean limitDensity, final ExtendedOptions opts) { + final boolean limitDensity, ExtendedOptions opts) { super(res, cache, limitDensity); mResources = res; + if (opts == null) { + opts = new ExtendedOptions(0); + } mOpts = opts; onOptsChanged(); @@ -258,8 +261,8 @@ public class ExtendedBitmapDrawable extends BasicBitmapDrawable implements // Draw the two possible overlay layers in reverse-priority order. // (each layer will no-op the draw when appropriate) // This ordering means cross-fade transitions are just fade-outs of each layer. - if (mProgress != null) mProgress.draw(canvas); - if (mPlaceholder != null) mPlaceholder.draw(canvas); + if (mProgress != null) onDrawPlaceholderOrProgress(canvas, mProgress); + if (mPlaceholder != null) onDrawPlaceholderOrProgress(canvas, mPlaceholder); } /** @@ -269,6 +272,13 @@ public class ExtendedBitmapDrawable extends BasicBitmapDrawable implements super.draw(canvas); } + /** + * Overriding this method to add your own custom placeholder or progress drawing. + */ + protected void onDrawPlaceholderOrProgress(final Canvas canvas, final TileDrawable drawable) { + drawable.draw(canvas); + } + @Override public void setAlpha(int alpha) { final int old = mPaint.getAlpha(); diff --git a/src/com/android/bitmap/drawable/TileDrawable.java b/src/com/android/bitmap/drawable/TileDrawable.java index 42400b4..d188281 100644 --- a/src/com/android/bitmap/drawable/TileDrawable.java +++ b/src/com/android/bitmap/drawable/TileDrawable.java @@ -68,6 +68,10 @@ public class TileDrawable extends Drawable implements Drawable.Callback { setVisible(false); } + public Drawable getInnerDrawable() { + return mInner; + } + @Override protected void onBoundsChange(Rect bounds) { super.onBoundsChange(bounds); |