项目中有用到四个圆角的ImageView,在各种参考之后,找到了一种适合自己项目的方法,话不多讲,直接上代码:
public class RoundImageView extends AppCompatImageView {
private int radius = 18; // 圆角半径
private int diameter = radius << 1; // 圆角直径
private Paint paint;
private Path path;
public RoundImageView(Context context) {
super(context);
initPaint();
}
public RoundImageView(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
}
public RoundImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initPaint();
}
private void initPaint() {
path = new Path();
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);// 消除锯齿
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
drawLeftTop(canvas);
drawRightTop(canvas);
drawLeftBottom(canvas);
drawRightBottom(canvas);
}
private void drawLeftTop(Canvas canvas) {
path.moveTo(0, radius);
path.lineTo(0, 0);
path.lineTo(radius, 0);
path.arcTo(new RectF(0, 0, diameter, diameter), -90, -90);
path.close();
canvas.drawPath(path, paint);
}
private void drawRightTop(Canvas canvas) {
path.moveTo(getWidth(), radius);
path.lineTo(getWidth(), 0);
path.lineTo(getWidth() - radius, 0);
path.arcTo(new RectF(getWidth() - diameter, 0, getWidth(), diameter), -90, 90);
path.close();
canvas.drawPath(path, paint);
}
private void drawLeftBottom(Canvas canvas) {
path.moveTo(0, getHeight() - radius);
path.lineTo(0, getHeight());
path.lineTo(radius, getHeight());
path.arcTo(new RectF(0,getHeight() - diameter, diameter, getHeight()), 90, 90);
path.close();
canvas.drawPath(path, paint);
}
private void drawRightBottom(Canvas canvas) {
path.moveTo(getWidth() - radius, getHeight());
path.lineTo(getWidth(), getHeight());
path.lineTo(getWidth(), getHeight() - radius);
RectF oval = new RectF(getWidth() - diameter, getHeight() - diameter, getWidth(), getHeight());
path.arcTo(oval, 0, 90);
path.close();
canvas.drawPath(path, paint);
}
}
代码中,默认圆角的半径为18,要借鉴的小伙伴可根据需求自行调整。
该方法可能对很多项目都不使用,它仅作为自己的工作记录,方便以后查询。