圆形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) {
    super(context, attrs);
}

@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, Shader.TileMode.CLAMP, Shader.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);
    }
}

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、付费专栏及课程。

余额充值