Android想要使用ImageView圆形头像图片,可以自己定义一个CircleImageView继承ImageView类,也可以使用Glide框架来加载ImageView圆形图片,下面分别来介绍这两种形式。
方法一:定义CircleImageView,继承ImageView类
package com.android.presentation.app; import android.annotation.Nullable; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Shader; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.ImageView; /** * 功能描述:一个简洁而高效的圆形ImageView * */ public class CircleImageView extends ImageView { private float width; private float height; private float radius; private Paint paint; private Matrix matrix; public CircleImageView(Context context) { this(context, null); } public CircleImageView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public CircleImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); paint = new Paint(); paint.setAntiAlias(true); //设置抗锯齿 matrix = new Matrix(); //初始化缩放矩阵 } /** * 测量控件的宽高,并获取其内切圆的半径 */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = getMeasuredWidth(); height = getMeasuredHeight(); radius = Math.min(width, height) / 2; } @Override protected void onDraw(Canvas canvas) { Drawable drawable = getDrawable(); if (drawable == null) { super.onDraw(canvas); return; } if (drawable instanceof BitmapDrawable) { BitmapShader bitmapShader = initBitmapShader((BitmapDrawable) drawable); if(bitmapShader!=null) { paint.setShader(bitmapShader);//将着色器设置给画笔 canvas.drawCircle(width / 2, height / 2, radius, paint);//使用画笔在画布上画圆 } return; } super.onDraw(canvas); } /** * 获取ImageView中资源图片的Bitmap,利用Bitmap初始化图片着色器,通过缩放矩阵将原资源图片缩放到铺满整个绘制区域,避免边界填充 */ private BitmapShader initBitmapShader(BitmapDrawable drawable) { Bitmap bitmap = drawable.getBitmap(); if(bitmap==null) { return null; } BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); float scale = Math.max(width / bitmap.getWidth(), height / bitmap.getHeight()); matrix.setScale(scale, scale);//将图片宽高等比例缩放,避免拉伸 bitmapShader.setLocalMatrix(matrix); return bitmapShader; } }
然后在xml中使用:
<com.android.presentation.app.CircleImageView android:layout_width="100px" android:layout_height="100px" android:scaleType="fitXY" android:layout_marginLeft="100px" android:layout_marginTop="100px" android:src="@drawable/aiqing"/>
方法二:直接使用Glide框架来加载圆形头像图片
Glide.with(mContext) .load(R.drawable.aiqing) .apply(RequestOptions.circleCropTransform()) .into(headImg);
效果如图所示: