RoundedAvatarDrawable: A Drawable that draws an oval with given {@link Bitmap} See http://evel.io/2013/07/21/rounded-avatars-in-android/
/* | |
* Copyright 2013 Evelio Tarazona Cáceres <evelio@evelio.info> | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package info.evelio.drawable; | |
import android.graphics.Bitmap; | |
import android.graphics.BitmapShader; | |
import android.graphics.Canvas; | |
import android.graphics.ColorFilter; | |
import android.graphics.Paint; | |
import android.graphics.PixelFormat; | |
import android.graphics.Rect; | |
import android.graphics.RectF; | |
import android.graphics.Shader; | |
import android.graphics.drawable.Drawable; | |
/** | |
* A Drawable that draws an oval with given {@link Bitmap} | |
*/ | |
public class RoundedAvatarDrawable extends Drawable { | |
private final Bitmap mBitmap; | |
private final Paint mPaint; | |
private final RectF mRectF; | |
private final int mBitmapWidth; | |
private final int mBitmapHeight; | |
public RoundedAvatarDrawable(Bitmap bitmap) { | |
mBitmap = bitmap; | |
mRectF = new RectF(); | |
mPaint = new Paint(); | |
mPaint.setAntiAlias(true); | |
mPaint.setDither(true); | |
final BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); | |
mPaint.setShader(shader); | |
// NOTE: we assume bitmap is properly scaled to current density | |
mBitmapWidth = mBitmap.getWidth(); | |
mBitmapHeight = mBitmap.getHeight(); | |
} | |
@Override | |
public void draw(Canvas canvas) { | |
canvas.drawOval(mRectF, mPaint); | |
} | |
@Override | |
protected void onBoundsChange(Rect bounds) { | |
super.onBoundsChange(bounds); | |
mRectF.set(bounds); | |
} | |
@Override | |
public void setAlpha(int alpha) { | |
if (mPaint.getAlpha() != alpha) { | |
mPaint.setAlpha(alpha); | |
invalidateSelf(); | |
} | |
} | |
@Override | |
public void setColorFilter(ColorFilter cf) { | |
mPaint.setColorFilter(cf); | |
} | |
@Override | |
public int getOpacity() { | |
return PixelFormat.TRANSLUCENT; | |
} | |
@Override | |
public int getIntrinsicWidth() { | |
return mBitmapWidth; | |
} | |
@Override | |
public int getIntrinsicHeight() { | |
return mBitmapHeight; | |
} | |
public void setAntiAlias(boolean aa) { | |
mPaint.setAntiAlias(aa); | |
invalidateSelf(); | |
} | |
@Override | |
public void setFilterBitmap(boolean filter) { | |
mPaint.setFilterBitmap(filter); | |
invalidateSelf(); | |
} | |
@Override | |
public void setDither(boolean dither) { | |
mPaint.setDither(dither); | |
invalidateSelf(); | |
} | |
public Bitmap getBitmap() { | |
return mBitmap; | |
} | |
// TODO allow set and use target density, mutate, constant state, changing configurations, etc. | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
Hi!
I found bug in this code. Sometimes we get grey circle after drawing. Google says - the problem in shader, but i dunno how to fix it. Will write if find solution.
Regards.