在学习自定义圆形及圆角图片的过程中,首先尝试的是通过继承ImageView,然后对其进行自定义扩张来实现,但是过程中总是遇到OOM,或者图片裁剪拉伸等问题,由于水平有限又急于学习下一步的知识,所以寻找了另外的方式,借鉴大神代码,通过自定义Drawable 简单完成了圆形和圆角图片,下面代码作为记录,好记性不如烂笔头。
- 自定义Drawable,相比View来说,Drawable属于轻量级的、使用也很简单。Drawable相对能提升我们的UI的性能。相比与直接自定义view,自定义drawable也是另外一种方式。
- 但是自定义Drawable无法再xml中使用,因此降低了定义Drawable的使用范围
public class CircleRoundDrawable extends Drawable {
private Paint paint;//画笔
private int mWidth;//图片宽与高的最小值
private RectF rectF;//矩形
private int radius;//半径
private int roundAngle = 30;//默认圆角
private Bitmap bitmap;//位图
private int type=2;//默认为圆形
public static final int TYPE_Round = 1;
public static final int Type_Circle = 2;
public CircleRoundDrawable(Context context, int resID) {
this(BitmapFactory.decodeResource(context.getResources(), resID));
}
public CircleRoundDrawable(Bitmap bitmap) {
this.bitmap = bitmap;
paint = new Paint();
paint.setAntiAlias(true);//抗锯齿
paint.setDither(true);//抖动,不同屏幕尺的使用保证图片质量
///位图渲染器
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(bitmapShader);
mWidth = Math.min(bitmap.getWidth(), bitmap.getHeight());
//初始化半径
radius = mWidth / 2;
}
/***
* 对外暴露的方法
* @param roundAngle
*/
public void setRoundAngle(int roundAngle) {
this.roundAngle = roundAngle;
}
public void setType(int type) {
this.type = type;
}
/**
* drawable将被绘制在画布上的区域
*
* @param left
* @param top
* @param right
* @param bottom
*/
@Override
public void setBounds(int left, int top, int right, int bottom) {
super.setBounds(left, top, right, bottom);
//绘制区域
rectF = new RectF(left, top, right, bottom);
}
/**
* 核心方法
*
* @param canvas
*/
@Override
public void draw(@NonNull Canvas canvas) {
if (type ==Type_Circle) {
canvas.drawCircle(mWidth / 2, mWidth / 2, radius, paint);
} else{
canvas.drawRoundRect(rectF, roundAngle, roundAngle, paint);
}
}
@Override
public void setAlpha(int i) {
paint.setAlpha(i);
invalidateSelf();//更新设置
}
@Override
public int getIntrinsicHeight() {
if (type == Type_Circle) {
return mWidth;
}
return bitmap.getHeight();
}
@Override
public int getIntrinsicWidth() {
if (type == Type_Circle) {
return mWidth;
}
return bitmap.getWidth();
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
paint.setColorFilter(colorFilter);
invalidateSelf();//更行设置
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}