package com.kenny.openimgur.ui; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.support.annotation.Nullable; import android.support.v4.graphics.drawable.RoundedBitmapDrawable; import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; import com.nostra13.universalimageloader.core.assist.LoadedFrom; import com.nostra13.universalimageloader.core.display.BitmapDisplayer; import com.nostra13.universalimageloader.core.imageaware.ImageAware; /** * Created by kcampagna on 12/22/14. */ public class CircleBitmapDisplayer implements BitmapDisplayer { private final Resources mResources; public CircleBitmapDisplayer(Resources resources) { mResources = resources; } @Override public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) { imageAware.setImageDrawable(getRoundedBitmapDrawable(mResources, bitmap)); } /** * Creates a round drawable * * @param res * @param bitmap * @return */ @Nullable public static RoundedBitmapDrawable getRoundedBitmapDrawable(Resources res, Bitmap bitmap) { if (bitmap == null || bitmap.isRecycled()) return null; float radius = Math.max(bitmap.getWidth(), bitmap.getHeight()) / 2.0f; return getRoundedBitmapDrawable(res, bitmap, radius); } /** * Creates a drawable with rounded corners * * @param res * @param bitmap * @param radius * @return */ @Nullable public static RoundedBitmapDrawable getRoundedBitmapDrawable(Resources res, Bitmap bitmap, float radius) { if (bitmap == null || bitmap.isRecycled()) return null; RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(res, bitmap); drawable.setCornerRadius(radius); return drawable; } /** * Returns a bitmap that has been rounded * * @param bitmap * @return */ @Nullable public static Bitmap getRoundedBitmap(Bitmap bitmap) { if (bitmap == null || bitmap.isRecycled()) return null; Bitmap output; if (bitmap.getWidth() > bitmap.getHeight()) { output = Bitmap.createBitmap(bitmap.getHeight(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); } else { output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getWidth(), Bitmap.Config.ARGB_8888); } float radius; if (bitmap.getWidth() > bitmap.getHeight()) { radius = bitmap.getHeight() / 2; } else { radius = bitmap.getWidth() / 2; } Canvas canvas = new Canvas(output); final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(Color.BLACK); canvas.drawCircle(radius, radius, radius, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } }