感谢CSDN一些大佬们的宝贵资料,下面是借用大佬们的知识和自己一些浅薄的见解所写的。
Java文件中
//在这里我到的包是x包,这里继承的Image View 也会有所不同
public class CircleImage extends AppCompatImageView {
//第一支画笔 (内圆)放图片的
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 抗锯齿
//获取位图对象
private Bitmap bitmap;
//着色器
private BitmapShader shader;
//矩阵(转换坐标)
private Matrix matrix = new Matrix();
private float radius;//半径
private int strokeColor = Color.WHITE;//默认边框是白色
/**
在这里颜色和边框都被我给写死了,要是想要通过出发某些方法去改变边框的大小或颜色,可以定义一个set方法传值
*/
private float strokeWidth = 3; //单位是像素的边框的宽度
//重写的三个方法(不用去在意)
public CircleImage(Context context) {
super(context);
}
public CircleImage(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CircleImage(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//取得图片的宽高的最小值作为半径
int size = Math.min(getMeasuredHeight(),getMeasuredWidth());//直径
radius = size/2;//半径
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
//这里没有判断是否为空,如果在布局文件中忘记加src会报空指针
bitmap = ((BitmapDrawable) drawable).getBitmap();
//计算缩放比例
float scale = (radius*2)/Math.min(bitmap.getWidth(),bitmap.getHeight());
shader = new BitmapShader(bitmap, Shader.TileMode.MIRROR, Shader.TileMode.CLAMP);
matrix.setScale(scale, scale);
shader.setLocalMatrix(matrix);
paint.setShader(shader);
//第二只画笔 外圆(通过内外圆重叠达到显示边框)
Paint whitePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
whitePaint.setColor(strokeColor);//给画笔设置颜色
//画外圆
canvas.drawCircle(radius, radius, radius, whitePaint);
//画内圆
canvas.drawCircle(radius, radius, radius - strokeWidth, paint);
}
}
布局文件中
<com.example.a0507news.util.CircleImage
android:id="@+id/shezhiMenu_img"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginHorizontal="10dp"
android:layout_marginVertical="10dp"
android:src="@mipmap/a"/>
</LinearLayout>
效果图