summaryrefslogtreecommitdiff
path: root/src/com/android/bitmap/drawable/CircularBitmapDrawable.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/bitmap/drawable/CircularBitmapDrawable.java')
-rw-r--r--src/com/android/bitmap/drawable/CircularBitmapDrawable.java136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/com/android/bitmap/drawable/CircularBitmapDrawable.java b/src/com/android/bitmap/drawable/CircularBitmapDrawable.java
new file mode 100644
index 0000000..32eb460
--- /dev/null
+++ b/src/com/android/bitmap/drawable/CircularBitmapDrawable.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.bitmap.drawable;
+
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.Paint.Style;
+import android.graphics.Rect;
+import android.graphics.Shader.TileMode;
+
+import com.android.bitmap.BitmapCache;
+
+/**
+ * Custom BasicBitmapDrawable implementation for circular images.
+ *
+ * This draws all bitmaps as a circle with an optional border stroke.
+ */
+public class CircularBitmapDrawable extends BasicBitmapDrawable {
+ private static Matrix sMatrix = new Matrix();
+
+ private final Paint mBitmapPaint = new Paint();
+ private final Paint mBorderPaint = new Paint();
+
+ private float mBorderWidth;
+
+ public CircularBitmapDrawable(Resources res,
+ BitmapCache cache, boolean limitDensity) {
+ super(res, cache, limitDensity);
+
+ mBitmapPaint.setAntiAlias(true);
+ mBitmapPaint.setFilterBitmap(true);
+ mBitmapPaint.setDither(true);
+
+ mBorderPaint.setColor(Color.TRANSPARENT);
+ mBorderPaint.setStyle(Style.STROKE);
+ mBorderPaint.setStrokeWidth(mBorderWidth);
+ mBorderPaint.setAntiAlias(true);
+ }
+
+ /**
+ * Set the border stroke width of this drawable.
+ */
+ public void setBorderWidth(final float borderWidth) {
+ final boolean changed = mBorderPaint.getStrokeWidth() != borderWidth;
+ mBorderPaint.setStrokeWidth(borderWidth);
+ mBorderWidth = borderWidth;
+
+ if (changed) {
+ invalidateSelf();
+ }
+ }
+
+ /**
+ * Set the border stroke color of this drawable. Set to {@link Color#TRANSPARENT} to disable.
+ */
+ public void setBorderColor(final int color) {
+ final boolean changed = mBorderPaint.getColor() != color;
+ mBorderPaint.setColor(color);
+
+ if (changed) {
+ invalidateSelf();
+ }
+ }
+
+ @Override
+ protected void onDrawBitmap(final Canvas canvas, final Rect src,
+ final Rect dst) {
+ onDrawCircularBitmap(getBitmap().bmp, canvas, src, dst);
+ }
+
+ /**
+ * Call this method with a given bitmap to draw it onto the given canvas, masked by a circular
+ * BitmapShader.
+ */
+ protected void onDrawCircularBitmap(final Bitmap bitmap, final Canvas canvas,
+ final Rect src, final Rect dst) {
+ // Draw bitmap through shader first.
+ BitmapShader shader = new BitmapShader(bitmap, TileMode.CLAMP,
+ TileMode.CLAMP);
+ sMatrix.reset();
+
+ // Fit bitmap to bounds.
+ float scale = Math.max((float) dst.width() / src.width(),
+ (float) dst.height() / src.height());
+ sMatrix.postScale(scale, scale);
+
+ // Translate bitmap to dst bounds.
+ sMatrix.postTranslate(dst.left, dst.top);
+
+ shader.setLocalMatrix(sMatrix);
+ mBitmapPaint.setShader(shader);
+ canvas.drawCircle(dst.centerX(), dst.centerY(), dst.width() / 2,
+ mBitmapPaint);
+
+ // Then draw the border.
+ canvas.drawCircle(dst.centerX(), dst.centerY(),
+ dst.width() / 2f - mBorderWidth / 2, mBorderPaint);
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ super.setAlpha(alpha);
+
+ final int old = mBitmapPaint.getAlpha();
+ mBitmapPaint.setAlpha(alpha);
+ if (alpha != old) {
+ invalidateSelf();
+ }
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter cf) {
+ super.setColorFilter(cf);
+ mPaint.setColorFilter(cf);
+ }
+}