自定义RoundImageView

11 篇文章 0 订阅

我们经常开发中会用到圆形的imageView来展示头像的功能,接下来就写个自定义的ImageView来展示;

思路:

1、自定义RoundImageView,重写 onDraw的方法;

2、获取RoundImageView 的宽高,以及padding,算出圆形的半径,绘制圆;

效果图如下:



代码如下:

public class RoundImage extends ImageView {
    private Bitmap img;

    public RoundImage(Context context) {
        super(context);
    }

    public RoundImage(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        //重用机制
        createBuffer();
        if (img != null) {
            canvas.drawBitmap(img, getPaddingLeft(), getPaddingTop(), null);
        }
    }

    private final void createBuffer() {
        int dstW = getWidth();
        int dstH = getHeight();
        dstW -= getPaddingLeft();
        dstW -= getPaddingRight();
        dstH -= getPaddingBottom();
        dstH -= getPaddingTop();

        //取最小值画当圆的半径
        int rr = Math.min(dstW, dstH);

        int srcW;
        int srcH;
        if (img == null) {
            srcW = 0;
            srcH = 0;
        } else {
            srcW = img.getWidth();
            srcH = img.getHeight();
        }

        if ((dstW == srcW) && (dstH == srcH)) {
            if ((dstW == 0) || dstH == 0) {
                return;
            }
            //把图片设置成透明的
            img.eraseColor(0);
        } else {
            img = Bitmap.createBitmap(dstW, dstH, Bitmap.Config.ARGB_8888);
        }
        Canvas c = new Canvas(img);
        Paint p = new Paint();
        p.setAntiAlias(true);//抗锯齿
        p.setFilterBitmap(true);//对Drawable过滤,选择 drawable文件时,也会有抗锯齿的效果
        p.setDither(true);//设置防抖动(显示出来的绘制效果更柔和)
        p.setColor(0xFFFFFFFF);
        c.drawCircle(dstW >> 1, dstH >> 1, rr >> 1, p);//>>相当于 除以2
        p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//取两层绘制交集。显示上层。

        if (getDrawable() != null) {
            Bitmap b = ((BitmapDrawable) getDrawable()).getBitmap();
            c.drawBitmap(b, this.getImageMatrix(), p);//getImageMatrix()主要是用来拿到图片的缩放信息和状态的
        }

    }
}
其实代码不难,主要是一些方法比较少用,大家知道的都不多,主要备注都已经贴上了。欢迎交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值