ImageView自定义圆形

本文介绍了一个自定义的Android ImageView组件,该组件能够将任意图片显示为圆形。通过使用BitmapShader和Canvas API,实现了图片的圆形裁剪效果。适用于头像等需要圆形显示的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 自定义Imageview圆形
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;

public class ImageViewPlus extends ImageView {

  private Paint mPaintBitmap = new Paint(Paint.ANTI_ALIAS_FLAG);
          private Bitmap mRawBitmap;
          private BitmapShader mShader;
         private Matrix mMatrix = new Matrix();

    public ImageViewPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub

    }

    public ImageViewPlus(Context context, AttributeSet attrs) {
        this(context, attrs,0);
        // TODO Auto-generated constructor stub
    }

    public ImageViewPlus(Context context) {
        this(context,null);
        // TODO Auto-generated constructor stub
    }

    @Override
         protected void onDraw(Canvas canvas) {
            Bitmap rawBitmap = getBitmap(getDrawable());
             if (rawBitmap != null){
                int viewWidth = getWidth();
                 int viewHeight = getHeight();
                 int viewMinSize = Math.min(viewWidth, viewHeight);
                 float dstWidth = viewMinSize;
                 float dstHeight = viewMinSize;
                 if (mShader == null || !rawBitmap.equals(mRawBitmap)){
                     mRawBitmap = rawBitmap;
                     mShader = new BitmapShader(mRawBitmap, TileMode.CLAMP, TileMode.CLAMP);
                 }
                 if (mShader != null){
                     mMatrix.setScale(dstWidth / rawBitmap.getWidth(), dstHeight / rawBitmap.getHeight());
                     mShader.setLocalMatrix(mMatrix);
                 }
                 mPaintBitmap.setShader(mShader);
                 float radius = viewMinSize / 2.0f;
                 canvas.drawCircle(radius, radius, radius, mPaintBitmap);
             } else {
                 super.onDraw(canvas);
             }
         }

    @SuppressLint("NewApi")
    private Bitmap getBitmap(Drawable drawable){
                 if (drawable instanceof BitmapDrawable){
                     return ((BitmapDrawable)drawable).getBitmap();
                } else if (drawable instanceof ColorDrawable){
                     Rect rect = drawable.getBounds();
                     int width = rect.right - rect.left;
                     int height = rect.bottom - rect.top;
                     int color = ((ColorDrawable)drawable).getColor();
                    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                     Canvas canvas = new Canvas(bitmap);
                    canvas.drawARGB(Color.alpha(color), Color.red(color), Color.green(color), Color.blue(color));
                    return bitmap;
                 } else {
                     return null;
                 }
             }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值