package com.bootstrap.drawable; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Shader; import android.graphics.drawable.Drawable; public class CirculaBitmapDrawable extends Drawable { private final Paint paint; private final Path path; private BitmapShader bitmapShader; private RectF bitmapRect; public CirculaBitmapDrawable(final Bitmap bitmap) { bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); bitmapRect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight()); paint = new Paint(); paint.setAntiAlias(true); paint.setShader(bitmapShader); path = new Path(); } public CirculaBitmapDrawable(final int color) { paint = new Paint(); paint.setAntiAlias(true); paint.setColor(color); path = new Path(); } @Override protected void onBoundsChange(final Rect bounds) { if (bitmapShader != null && bitmapRect != null) { final Matrix matrix = new Matrix(); matrix.setRectToRect(bitmapRect, new RectF(bounds), Matrix.ScaleToFit.CENTER); bitmapShader.setLocalMatrix(matrix); } final RectF viewRect = new RectF(0, 0, bounds.width(), bounds.height()); path.reset(); path.addCircle(viewRect.centerX(), viewRect.centerY(), Math.min(viewRect.width(), viewRect.height()), Path.Direction.CW); } @Override public void draw(final Canvas canvas) { canvas.drawPath(path, paint); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } @Override public void setAlpha(final int alpha) { paint.setAlpha(alpha); } @Override public void setColorFilter(final ColorFilter cf) { paint.setColorFilter(cf); } }