圆形加边框图片

来源:互联网 发布:三国乱世盘古挂机软件 编辑:程序博客网 时间:2024/04/30 00:43

原理:

1、继承imageview,重写设置图片的方法,将图片保存下来

2、在onSizeChanged的方法里面去重画图片

3、将图片压缩为设定大小,用圆形画笔画在画布上,再在外面画一个圆形边框

源码如下:

public class CircleImageView extends ImageView {

private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;
private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
private static final int COLORDRAWABLE_DIMENSION = 1;
private final Paint mBitmapPaint = new Paint();
private final Paint mBorderPaint = new Paint();
private final Paint mBorderOutPaint = new Paint();
private int mBorderWidth;
private int mOutBorderWidth;
private float bmRaduis;
private float outRaduis;

public CircleImageView(Context context) {
this(context, null);
}

public CircleImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setScaleType(SCALE_TYPE);
mBorderWidth = (int) getResources().getDimension(R.dimen.px6_dip);
mOutBorderWidth = (int) getResources().getDimension(R.dimen.px2_dip);
initPaint();
}

public void setBorderWidth(float px) {
mBorderWidth = (int) px;
}

private void initPaint() {
mBitmapPaint.setAntiAlias(true);
mBitmapPaint.setFilterBitmap(true);
mBitmapPaint.setStyle(Paint.Style.FILL);
mBorderPaint.setStyle(Paint.Style.STROKE);
mBorderPaint.setAntiAlias(true);
mBorderPaint.setColor(Color.WHITE);
mBorderPaint.setStrokeWidth(mBorderWidth);
mBorderOutPaint.setStyle(Paint.Style.STROKE);
mBorderOutPaint.setAntiAlias(true);
mBorderOutPaint.setColor(Color.parseColor("#f5f5f5"));
mBorderOutPaint.setStrokeWidth(mOutBorderWidth);
}

@Override
public ScaleType getScaleType() {
return SCALE_TYPE;
}

@Override
public void setScaleType(ScaleType scaleType) {
if (scaleType != SCALE_TYPE) {
throw new IllegalArgumentException("not support");
}
}

@Override
protected void onDraw(Canvas canvas) {
if (getDrawable() == null) {
return;
}
canvas.drawCircle(getWidth() / 2, getHeight() / 2, bmRaduis, mBitmapPaint);
canvas.drawCircle(getWidth() / 2, getHeight() / 2, bmRaduis, mBorderPaint);
canvas.drawCircle(getWidth() / 2, getHeight() / 2, outRaduis, mBorderOutPaint);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
setup(getBitmapFromDrawable(getDrawable()));
}

@Override
public void setImageBitmap(Bitmap bm) {
super.setImageBitmap(bm);
setup(bm);
}

private void setup(Bitmap bm) {
if (bm == null) {
return;
}
RectF rectF = new RectF();
rectF.set(0, 0, getWidth(), getHeight());
final float min = Math.min(rectF.width(), rectF.height());
int bmWidth = bm.getWidth();
int bmHeight = bm.getHeight();
float scale;
float dx = 0;
float dy = 0;
Matrix matrix = new Matrix();
matrix.set(null);
if (bmWidth * rectF.height() > rectF.width() * bmHeight) {
scale = rectF.height() / (float) bmHeight;
dx = (rectF.width() - bmWidth * scale) * 0.5f;
} else {
scale = rectF.width() / (float) bmWidth;
dy = (rectF.height() - bmHeight * scale) * 0.5f;
}
matrix.setScale(scale, scale);
matrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth);
Shader shader = new BitmapShader(bm, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
shader.setLocalMatrix(matrix);
mBitmapPaint.setShader(shader);
bmRaduis = min / 2 - mOutBorderWidth - mBorderWidth;
outRaduis = min / 2 - mOutBorderWidth - mBorderWidth / 2;
invalidate();
}

@Override
public void setImageDrawable(Drawable drawable) {
super.setImageDrawable(drawable);
setup(getBitmapFromDrawable(drawable));
}

@Override
public void setImageResource(int resId) {
super.setImageResource(resId);
setup(getBitmapFromDrawable(getDrawable()));
}

private Bitmap getBitmapFromDrawable(Drawable drawable) {
if (drawable == null) {
return null;
}

if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
try {
Bitmap bitmap;

if (drawable instanceof ColorDrawable) {
bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
} else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
}
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
} catch (OutOfMemoryError e) {
return null;
}
}

private int dip(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
}
}

这个只是一个小技巧,主要在与理解imageview显示图片的过程,如有疑问,欢迎在下面留言

0 0