1.自定义RoundImageView
package com.examle.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.ImageView;
import androidx.annotation.ColorInt;
import androidx.annotation.Dimension;
import androidx.annotation.Nullable;
import com.examlpe.R;
public class RoundImageView extends ImageView {
private String TGA=RoundImageView.class.getSimpleName();
private final PorterDuffXfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP);//绘制模式
private final Paint mPaint;//实体paint
private final Paint mStrokePaint;//描边paint
private int mRadius;//圆角值
private int mStrokeWidthColor;//描边颜色
private int mStrokeWidth;//描边宽度
private boolean mIsCircle;//true-圆形模式,false-圆角矩形模式
public RoundImageView(Context context) {
this(context, null);
}
public RoundImageView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public RoundImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public RoundImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RoundImageView);
mStrokeWidthColor = a.getColor(R.styleable.RoundImageView_riv_stroke_color, Color.WHITE);
mStrokeWidth = a.getDimensionPixelSize(R.styleable.RoundImageView_riv_stroke_width, 0);
mRadius = a.getDimensionPixelSize(R.styleable.RoundImageView_riv_round_radius, 0);
mIsCircle = a.getBoolean(R.styleable.RoundImageView_riv_circle, false);
a.recycle();
mPaint = new Paint();
mPaint.setAntiAlias(true);//抗锯齿
mPaint.setColor(Color.WHITE);
mPaint.setStyle(Paint.Style.FILL);
mStrokePaint = new Paint();
mStrokePaint.setAntiAlias(true);//抗锯齿
mStrokePaint.setStyle(Paint.Style.STROKE);
}
@Override
protected void onDraw(Canvas canvas) {
int layerId = canvas.saveLayer(0, 0, getWidth(), getHeight(), null);//保存图层
super.onDraw(canvas);
Drawable src = getDrawable();
if (src != null && getWidth() > 0 && getHeight() > 0) {
Bitmap tmpBp = Bitmap.createBitmap(getWidth() - getPaddingLeft() - getPaddingRight(), getHeight() - getPaddingTop() - getPaddingBottom(), Bitmap.Config.ARGB_8888);
Canvas tmpCv = new Canvas(tmpBp);//tmpBp画布
float tmpR = Math.min(tmpBp.getWidth(), tmpBp.getHeight()) * 0.5f;//取最小宽度
if (mIsCircle) {//圆形模式
tmpCv.drawCircle(tmpR, tmpR, tmpR, mPaint);//绘制圆形
} else {//圆角矩形模式
tmpCv.drawRoundRect(0, 0, tmpBp.getWidth(), tmpBp.getHeight(), mRadius, mRadius, mPaint);//绘制圆角矩形
}
mPaint.setXfermode(xfermode);//绘制模式
canvas.drawBitmap(tmpBp, getPaddingLeft(), getPaddingTop(), mPaint);//绘制位图
if (mStrokeWidth > 0) {//描边
mStrokePaint.setColor(mStrokeWidthColor);//描边颜色
mStrokePaint.setStrokeWidth(mStrokeWidth);//描边宽度
if (mIsCircle) {//圆形模式
canvas.drawCircle(getPaddingLeft()+tmpR, getPaddingTop()+tmpR, tmpR-mStrokeWidth*0.5f, mStrokePaint);
} else {//圆角矩形模式
canvas.drawRoundRect(getPaddingLeft()+mStrokeWidth*0.5f, getPaddingTop()+mStrokeWidth*0.5f, getWidth() - getPaddingRight()-mStrokeWidth*0.5f, getHeight() - getPaddingBottom()-mStrokeWidth*0.5f, mRadius-mStrokeWidth*0.5f, mRadius-mStrokeWidth*0.5f, mStrokePaint);//绘制圆角
}
}
}
canvas.restoreToCount(layerId);//恢复图层
}
/**
* 圆角值 dp
* @param dpValue
*/
public void setRadius(@Dimension int dpValue) {
this.mRadius =(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dpValue,getResources().getDisplayMetrics());
invalidate();
}
/**
* 描边颜色
* @param strokeWidthColor
*/
public void setStrokeWidthColor(@ColorInt int strokeWidthColor) {
this.mStrokeWidthColor = strokeWidthColor;
invalidate();
}
/**
* 描边宽度 dp
* @param dpValue
*/
public void setStrokeWidth(@Dimension int dpValue) {
this.mStrokeWidth =(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dpValue,getResources().getDisplayMetrics());
invalidate();
}
/**
* 圆角矩形 或 圆形控件
* @param isCircle
*/
public void setCircle(boolean isCircle) {
this.mIsCircle = isCircle;
invalidate();
}
}
2.新建attrs.xml 文件,路径 res/values/attrs.xml
3.布局使用:圆角矩形
4.布局使用:圆形控件