package uk.co.imallan.tuchongdaily.ui.view;
import android.content.Context;
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.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
public class CircularImageView extends ImageView {
private int shadow;
private int shadowColor;
public CircularImageView(Context context) {
this(context, null);
}
public CircularImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CircularImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.shadow = 0;
this.shadowColor = -1;
}
@Override
public void setImageDrawable(Drawable drawable) {
RoundedDrawable roundedDrawable = null;
if (drawable instanceof BitmapDrawable) {
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
if (bitmap != null) {
roundedDrawable = new RoundedDrawable(bitmap);
}
}
if (roundedDrawable != null) {
super.setImageDrawable(roundedDrawable);
} else {
super.setImageDrawable(drawable);
}
}
class RoundedDrawable extends Drawable {
private final BitmapShader bitmapShader;
private final Paint paint;
private final int x;
private final int y;
private final int radius;
RoundedDrawable(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint = new Paint();
paint.setAntiAlias(true);
x = width / 2;
y = height / 2;
radius = Math.min(width, height) / 2;
}
@Override
public void draw(Canvas canvas) {
int width = getWidth();
int height = getHeight();
if (shadowColor != -1) {
paint.setShader(null);
paint.setColor(shadowColor);
canvas.drawCircle(width / 2, height / 2, Math.min(width, height / 2), paint);
}
paint.setShader(bitmapShader);
float xScale = (float) (width - shadow * 2) / (radius * 2);
float yScale = (float) (height - shadow * 2) / (radius * 2);
canvas.translate((radius - x) * xScale, (radius - y) * yScale);
canvas.scale(xScale, yScale);
canvas.drawCircle(x + shadow / xScale, y + shadow / yScale, radius, paint);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
@Override
public void setAlpha(int alpha) {
paint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter cf) {
paint.setColorFilter(cf);
}
}
}