A fast ImageView (and Drawable) that supports rounded corners (and ovals or circles) based on the original example from Romain Guy. RoundedImageView is a full superset of CircleImageView (which is actually just a subset based on this lib) with many more advanced features like support for ovals, rounded rectangles, ScaleTypes and TileModes.
There are many ways to create rounded corners in android, but this is the fastest and best one that I know of because it:
- does not create a copy of the original bitmap
- does not use a clipPath which is not hardware accelerated and not anti-aliased.
- does not use setXfermode to clip the bitmap and draw twice to the canvas.
If you know of a better method, let me know (or even better open a pull request)!
Also has proper support for:
- Borders (with Colors and ColorStateLists)
- Ovals and Circles
- All
ScaleType
s- Borders are drawn at view edge, not bitmap edge
- Except on edges where the bitmap is smaller than the view
- Borders are not scaled up/down with the image (correct width and radius are maintained)
- Anti-aliasing
- Transparent backgrounds
- Hardware acceleration
- Support for LayerDrawables (including TransitionDrawables)
- TileModes for repeating drawables
RoundedImageView is available in Maven Central.
Add the following to your build.gradle
to use:
repositories {
mavenCentral()
}
dependencies {
compile 'com.makeramen:roundedimageview:2.0.0'
}
Define in xml:
<com.makeramen.roundedimageview.RoundedImageView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/imageView1"
android:src="@drawable/photo1"
android:scaleType="fitCenter"
app:riv_corner_radius="30dip"
app:riv_border_width="2dip"
app:riv_border_color="#333333"
app:riv_mutate_background="true"
app:riv_tile_mode="repeat"
app:riv_oval="true" />
Or in code:
RoundedImageView riv = new RoundedImageView(context);
riv.setScaleType(ScaleType.CENTER_CROP);
riv.setCornerRadius((float) 10);
riv.setBorderWidth((float) 2);
riv.setBorderColor(Color.DKGRAY);
riv.mutateBackground(true);
riv.setImageDrawable(drawable);
riv.setBackground(backgroundDrawable);
riv.setOval(true);
riv.setTileModeX(Shader.TileMode.REPEAT);
riv.setTileModeY(Shader.TileMode.REPEAT);
Or make a Transformation for Picasso:
Transformation transformation = new RoundedTransformationBuilder()
.borderColor(Color.BLACK)
.borderWidthDp(3)
.that iRadiusDp(30)
.oval(false)
.build();
Picasso.with(context)
.load(url)
.fit()
.transform(transformation)
.into(imageView);
-
2.0.0
- Package changed from
com.makeramen.*
tocom.makeramen.roundedimageview.*
setCornerRadius(int resId)
is nowsetCornerRadiusDimen(int resId)
for clarity.- Logging fix (#81)
- ColorFilter support (#73)
- Package changed from
-
1.5.0
Shader.TileMode
support
-
1.4.0
- initial ColorDrawable fix for Lollipop(5.0)
- xml attributes are now namespaced and start with
riv_
- renamed methods
mutatesBackground()
andmutateBackground(bool)
-
1.3.1
-
1.3.0
- A new
RoundedTransformationBuilder
to help build PicassoTransformation
s - slight API changes:
- all dimensions are now set at
float
s.int
s will be interpreted as dimension resource IDs round_background
is nowmutate_background
, and aRoundedDrawable
will no longer be created for the background ifmutate_background
is false.
- all dimensions are now set at
- A new
-
1.2.4
- add basic support for ColorDrawable (and other drawables with -1 intrinsic dimens)
- implementation of the above is known to be buggy in many cases, pull requests welcome
-
1.2.3
- added rudimentary support for
setImageUri
. Performance of the function is probably poor and users should be cautious when using it.
- added rudimentary support for
-
1.2.2
- fix for incorrect radius on the image when there is a border
- add a
toBitmap()
function for easier Picasso and Ion compatibility
-
1.2.1
- default scaleType now FIT_CENTER (and never null) to match Android (#27)
-
1.2.0
- add
setDither
andsetFilterBitmap
method support on RoundedDrawable for tuning bitmap scaling quality - improved performance for
setImageResource
- RoundedDrawable constructor is now public
- Fixed bug where artifact was downloading
aar.asc
file instead of aar. You no longer need to have@aar
specified in the dependency
- add
-
1.1.0
- LayerDrawable support (needs testing!)
- Refactored api to support chaining and remove repetitive code
-
1.0.0
- Initial release to maven central
- Programmatically setting attributes with TransitionDrawables not supported.