Skip to content

Instantly share code, notes, and snippets.

@melanke
Created October 25, 2013 17:19
Show Gist options
  • Select an option

  • Save melanke/7158342 to your computer and use it in GitHub Desktop.

Select an option

Save melanke/7158342 to your computer and use it in GitHub Desktop.
Android Rounded Image
public class MLRoundedImageView extends ImageView {
public MLRoundedImageView(Context context) {
super(context);
}
public MLRoundedImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MLRoundedImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (drawable == null) {
return;
}
if (getWidth() == 0 || getHeight() == 0) {
return;
}
Bitmap b = ((BitmapDrawable) drawable).getBitmap();
Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);
int w = getWidth(), h = getHeight();
Bitmap roundBitmap = getCroppedBitmap(bitmap, w);
canvas.drawBitmap(roundBitmap, 0, 0, null);
}
public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) {
Bitmap sbmp;
if (bmp.getWidth() != radius || bmp.getHeight() != radius) {
float smallest = Math.min(bmp.getWidth(), bmp.getHeight());
float factor = smallest / radius;
sbmp = Bitmap.createScaledBitmap(bmp, (int)(bmp.getWidth() / factor), (int)(bmp.getHeight() / factor), false);
} else {
sbmp = bmp;
}
Bitmap output = Bitmap.createBitmap(radius, radius,
Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xffa19774;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, radius, radius);
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.parseColor("#BAB399"));
canvas.drawCircle(radius / 2 + 0.7f,
radius / 2 + 0.7f, radius / 2 + 0.1f, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(sbmp, rect, rect, paint);
return output;
}
}
@theapache64

Copy link
Copy Markdown

Amazing, but how to set circular border for this ImageView ?

@theapache64

Copy link
Copy Markdown

@nguyenhuy: but it won't work in api level <14,i think. isn't?

@androsland

Copy link
Copy Markdown

Check my implementation. Improved to support NinePatch images https://github.com/androsland/MLRoundedImageView

@kumarkundan

Copy link
Copy Markdown

where did i supposed to link it with an image??? which line of code is pointing to image. or it will be in xml

@Muneefm

Muneefm commented Jun 20, 2015

Copy link
Copy Markdown

@kumarkundan: you can use this in xml as a view .. just use the header tag as
<your.package.name.MLRoundedImageView

/> thats all..

@shrutilv

Copy link
Copy Markdown

I am getting :
android.view.InflateException: Binary XML file line #12: Error inflating class

@broncha

broncha commented Aug 27, 2015

Copy link
Copy Markdown
int w = getWidth(), h = getHeight();
int radius = w > h ? h:w; // set the smallest edge as radius.
Bitmap roundBitmap = getCroppedBitmap(bitmap, radius);

@L-Briand

Copy link
Copy Markdown

for those who wants a center crop
create a Rect like this

int rad = radius/2;
Rect rectSrc = new Rect(
    sbmp.getWidth()/2 - rad,
    sbmp.getHeight()/2 - rad,
    sbmp.getWidth()/2 + rad,
    sbmp.getHeight()/2 + rad
);

and draw the bitmap like this
canvas.drawBitmap(sbmp, rectSrc, rect, paint);

@kamalkishor

Copy link
Copy Markdown

Giving java.lang.NullPointerException at MLRoundedImageView.onDraw(MLRoundedImageView.java:56)

@thanhtran-skywalk

Copy link
Copy Markdown

I added one more button, when the button was clicked, it open the gallery, let user select the picture and inflate into your CircleImageView. everything was OK.
but, somehow, Some pictures auto rotated in CircleImageView.
I'm a newbie in Android, so, Could you please help me, how do I disable the auto rotation?
Thanks.

@aqibbutt

Copy link
Copy Markdown

hi ,
the code is running on my side but issue is pixels of the image are too bad how to fix it ?

@Tuccro

Tuccro commented Jun 29, 2016

Copy link
Copy Markdown

Please change 27-28 lines to:

    Bitmap b;

    try {
        b = ((BitmapDrawable) drawable).getBitmap();
    } catch (ClassCastException e) {
        Log.e(TAG, String.format("You can't use %s!", drawable.getClass().getSimpleName()), e);
        return;
    }

    Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);`

for cases if somebody trying to use LayerDrawable, for example.

@Malobash

Copy link
Copy Markdown

Nice solution.. how can i create border for this rounded image view??

ghost commented Apr 19, 2017

Copy link
Copy Markdown

Many thanks <3

@khan-tm

khan-tm commented May 3, 2017

Copy link
Copy Markdown

Scale Type 😭

@farooqkhan003

Copy link
Copy Markdown

thanks @Megamzero . It worked for me. (Y)

@rinuelizabeth10

Copy link
Copy Markdown

Thanks! Worked for me

@mnaraniya

Copy link
Copy Markdown

how to add source image in this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment