Android自定义View之圆形ImageView--RoundImageView

原理:在canvas上先画一个圆形,再画一个Bitmap,取它们相交的部分

操作步骤:
1.通过Bitmap.createBitmap一个空白的Bitmap,宽和高都等同于布局文件的宽和高
2.使用paint.drawCircle在里面画一个圆
3.设置paint的重叠方式
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
4paint.drawBitmap(src,src_rect,dest_rect,filter)
把src里面定义的ImageView绘制到该Bitmap上,覆盖掉那个圆形
5.得到一个圆形的bitmap

代码展示:

public class RoundImageView extends ImageView {

    private Paint paint;

    public RoundImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

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

    public RoundImageView(Context context) {
        super(context);
        init();
    }

    private void init() {
        paint = new Paint();
        paint.setFilterBitmap(true);
        paint.setAntiAlias(true);
        paint.setDither(true);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Drawable drawable = getDrawable();
        if (drawable == null) {
            return;
        }
        Bitmap b = ((BitmapDrawable) drawable).getBitmap();
        canvas.drawBitmap(getRoundBitmap(b), 0, 0, null);
    }

    private Bitmap getRoundBitmap(Bitmap src) {
        //新建一张空白的Bitmap,长宽高跟布局文件中定义的长宽高一样
        Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
        //将Bitmap作为一张画布,在上面作画
        Canvas canvas = new Canvas(bitmap);
        //画一个圆形
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, Math.min(getWidth(), getHeight()) / 2 , paint);
        //设置paint的重叠方式,SRC_IN参数:保留重叠部分
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        //把源文件中的Bitmap缩放一下,大小跟画布一样,然后绘制到canvas上,这样就和之前的圆形重叠了,出现了一个圆形的图片
        final Rect src_rect = new Rect(0, 0, src.getWidth(), src.getHeight());
        final Rect dest_rect = new Rect(0, 0, getWidth(), getHeight());
        canvas.drawBitmap(src, src_rect, dest_rect, paint);
        //返回圆形的Bitmap
        return bitmap;
    }

}

此代码片段为通用代码,只要用得到圆形ImageView的地方都可直接使用

后续问题:在XML布局文件中使用了这个RoundImageView之后,想要在java代码中修改RoundImageView的Bitmap图片,会变成空白,怎么解决,求大神支招~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值