Skip to content

Instantly share code, notes, and snippets.

@bkurzius
Last active September 21, 2020 16:18
Show Gist options
  • Star 20 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save bkurzius/99c945bd1bdcf6af8f99 to your computer and use it in GitHub Desktop.
Save bkurzius/99c945bd1bdcf6af8f99 to your computer and use it in GitHub Desktop.
Circular NetworkImageView for use with Volley. Creates a circular bitmap and uses whichever dimension is smaller to determine the radius. Also constrains the circle to the leftmost part of that image. Used in the same way as the Volley NetworkImageView, in both code and xml. Of course you'll need to include the Volley Library in you app too.
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import com.android.volley.toolbox.NetworkImageView;
public class CircularNetworkImageView extends NetworkImageView {
Context mContext;
public CircularNetworkImageView(Context context) {
super(context);
mContext = context;
}
public CircularNetworkImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
mContext = context;
}
public CircularNetworkImageView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
mContext = context;
}
@Override
public void setImageBitmap(Bitmap bm) {
if(bm==null) return;
setImageDrawable(new BitmapDrawable(mContext.getResources(),
getCircularBitmap(bm)));
}
/**
* Creates a circular bitmap and uses whichever dimension is smaller to determine the width
* <br/>Also constrains the circle to the leftmost part of the image
*
* @param bitmap
* @return bitmap
*/
public Bitmap getCircularBitmap(Bitmap bitmap) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
int width = bitmap.getWidth();
if(bitmap.getWidth()>bitmap.getHeight())
width = bitmap.getHeight();
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, width, width);
final RectF rectF = new RectF(rect);
final float roundPx = width / 2;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
}
@sunilomrey
Copy link

How to use this ?

i edited the instructions above

@jakubturcovsky
Copy link

Please add a possibility to set transparent color as default src, it accepts only drawables for now.

@madsongr
Copy link

How to use that? CircularNetworkImageView cn = new CircularNetworkImageView()??

The easiest is to use it in the XML. Looks at the docs for NetworkImageView if you want to create it in code

@bkurzius
Copy link
Author

it should be able to be used the same way as the Volley NetworkImageView, using both code and xml. Of course you'll need to include the Volley Library in you app too

@petersf7
Copy link

Thanks! Works very well!

@cowboy93
Copy link

Perfect !!!

@AlobhaTechnologies
Copy link

Perfect thanks

@babakhalid
Copy link

works perfectly, thanks a lot.

@tkarakasoglu
Copy link

Good job dude

@SamBellerose
Copy link

Very sick !

@chandaninfowiz
Copy link

Followed this . it is working fine . but i am getting one problem . i have set the width and height of image but i am not able to display the images in same size. some images are big and some are small

@habil
Copy link

habil commented Jan 27, 2016

Thank you so much ;)

@maahibhat88
Copy link

Worked fine... Thanks for sharing
if anybody is applying this code he has to apply the code both in XML and Activity. Like this...

In XML:->
<yourPackageName.CircularNetworkImageView android:layout_width="60dp" android:layout_height="60dp" android:id="@+id/userImgClass" />

In Activity:->
CircularNetworkImageView thumbnail = ((CircularNetworkImageView) convertView.findViewById(R.id.main_activity_listview_item_thumbnail));

if you don't use your package name in XML u'll get ClassCastException

@kpg257
Copy link

kpg257 commented Mar 4, 2016

Thanks for sharing... Saved a lot of my time! :)

@rohit101293
Copy link

My image is displayed circular but only 3/4th of it. the remaining is gone..

@mohamedelgarnaoui
Copy link

Thank you so much

@Abydars
Copy link

Abydars commented Jul 9, 2016

Thanks for sharing! But setting the default image from resources, it is not rounded.

@CKalung
Copy link

CKalung commented Jul 18, 2016

Thanks a lot.... It's working well.

@IshanFx
Copy link

IshanFx commented Aug 12, 2016

Work perfect. when i add this to list view it overflow the memory. How can i avoid this?

@zmeid
Copy link

zmeid commented Aug 30, 2016

The original "CircularNetworkImageView.java" class is not well organized to use in recyclerview or listview. It calculates different sizes for each image. I have edited the "getCircularBitmap" method of original class, in order to get same-sized and same-positioned circular imageviews in recyclerview, listview.

https://gist.github.com/zmeid/b36f94237dadd7242b3343db92e86376

@metes
Copy link

metes commented Nov 8, 2016

It's working great! Thanks.

@power7714
Copy link

How can I use this to show image with corners in top left and bottom right only?

@codeshifu
Copy link

Ahhh. Thank you sooooo much

@thetundedoherty
Copy link

This is working perfectly..Thanks

@ShilpaCISPL
Copy link

Thanks..It works

@samuelDeveloperiOS
Copy link

Thanks. it works perfect.

@nanom1t
Copy link

nanom1t commented Jun 6, 2018

How I can use this?

    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/photo"
        android:layout_width="@dimen/sidebar_header_photo_size"
        android:layout_height="@dimen/sidebar_header_photo_size"
        android:paddingTop="@dimen/sidebar_header_spacing_vertical"
        android:scaleType="fitXY"
        app:srcCompat="@mipmap/ic_launcher_round" />
        CircularNetworkImageView navigationHeaderPhotoView = navigationHeader.findViewById(R.id.photo);
        String navigationHeaderPhotoUrl = profile.getPhotoUrl();
        ImageLoader navigationHeaderPhotoLoader = APIRequest.getInstance(getApplicationContext()).getImageLoader();
        navigationHeaderPhotoView.setImageUrl(navigationHeaderPhotoUrl, navigationHeaderPhotoLoader);

java.lang.RuntimeException: Unable to start activity ComponentInfo{net.app.android/net.app.android.MainActivity}: java.lang.ClassCastException: com.android.volley.toolbox.NetworkImageView cannot be cast to net.app.android.views.CircularNetworkImageView

@bhatguru03
Copy link

How I can use this?

    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/photo"
        android:layout_width="@dimen/sidebar_header_photo_size"
        android:layout_height="@dimen/sidebar_header_photo_size"
        android:paddingTop="@dimen/sidebar_header_spacing_vertical"
        android:scaleType="fitXY"
        app:srcCompat="@mipmap/ic_launcher_round" />
        CircularNetworkImageView navigationHeaderPhotoView = navigationHeader.findViewById(R.id.photo);
        String navigationHeaderPhotoUrl = profile.getPhotoUrl();
        ImageLoader navigationHeaderPhotoLoader = APIRequest.getInstance(getApplicationContext()).getImageLoader();
        navigationHeaderPhotoView.setImageUrl(navigationHeaderPhotoUrl, navigationHeaderPhotoLoader);

java.lang.RuntimeException: Unable to start activity ComponentInfo{net.app.android/net.app.android.MainActivity}: java.lang.ClassCastException: com.android.volley.toolbox.NetworkImageView cannot be cast to net.app.android.views.CircularNetworkImageView

In your xml file instead of using com.android.volley.toolbox.NetworkImageView use net.app.android.views.CircularNetworkImageView

@bhatguru03
Copy link

Thanks for the solution... Helped a lot

@hmzgtl16
Copy link

i'm rewrite this code in Kotlin, the color code its made error type mismatch with print.color

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