Glide怎么画圆角,进来看看

  众所周知,当你把布局搞定后,图片设置完后,可能会由于UX或UI的要求,为图片添加各种特效。结果有可能就会导致这个图片本应该填充为圆角的图片,因为特效变成矩形了。

  为了彻底解决圆角问题,那肯定是没有比画一个圆角图片更让人省心的了。

  

public class GlideRoundRectTransform extends BitmapTransformation {

    private static Context mContext;

    public GlideRoundRectTransform(Context context) {
        super(context);
        mContext = context;
    }

    public GlideRoundRectTransform(BitmapPool bitmapPool) {
        super(bitmapPool);
    }

    private static Bitmap createRoundRectImage(BitmapPool bitmapPool, Bitmap source){
        int width = source.getWidth();
        int height = source.getHeight();
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        //ismutabel?
        Bitmap target = bitmapPool.get(width, height, Bitmap.Config.ARGB_8888);
        if (null == target){
            target = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        }
        Canvas canvas = new Canvas(target);
        RectF rectF = new RectF(0, 0, width, height);
        canvas.drawRoundRect(rectF, mContext.getResources().getDimension(R.dimen.margin_6), mContext.getResources().getDimension(R.dimen.margin_6), paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(source, 0, 0, paint);
        return target;


    }

    @Override
    protected Bitmap transform(BitmapPool bitmapPool, Bitmap bitmap, int i, int i1) {
        if (null != bitmap && null != mContext) {
            return createRoundRectImage(bitmapPool, bitmap);
        } else {
            return null;
        }
    }

    @Override
    public String getId() {
        return getClass().getName();
    }

}

 

        if (view != null) {
            view.setTag(url);
            view.setImageResource(isVertical ? R.drawable.default_vertical : R.drawable.default_horizontal);
            Glide.with(mContext).load(url).asBitmap().transform(new GlideRoundRectTransform(mContext)).into(new SimpleTarget<Bitmap>() {
                @Override
                public void onLoadFailed(Exception e, Drawable errorDrawable) {
                    super.onLoadFailed(e, errorDrawable);
                    if (oldUrl != null) {
                        setImageByUrl(viewId, oldUrl);
                    }
                }

                @Override
                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                    if (TextUtils.equals((String) view.getTag(), url)) {
                        view.setImageBitmap(resource);
                    }
                }
            });
        }

挺直白的,在第二段代码中调用了transform方法,这个和调用CenterCrop()本质是一样的,最终会调用被重写的父类方法transform。

into的用法就不必赘述了,自行查阅。

主要就两个地方需要注意:BitmapTransformation的子类创建和图片裁剪部分。

第一点就不讲了,重写transform方法返回裁剪后的bitmap

第二点就是变形——裁剪出你想要的图片,这里还是考验你的艺术细胞的(🐶保命)

有几个点注意一下即可:

1、画笔是否抗锯齿 setAntiAlias可以设置

2、bitmapPool就是缓存用过的bitmap,这里我有时竟然拿不到pool的bitmap对象,于是自己创建一个保住🐶命。

3、既然是裁剪,那最合理的就是SRC_IN混合模式了,先画下边的DST白板圆角矩形,再画上边的SRC原图图像,然后啪的一下盖上去,留在DST上的就是裁剪后的图了。

4、如果用的是Shader着色器呢,也差不多,把Shader视为SRC,把后边的drawXXX视为DST白板图片。

Bitmap src = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
BitmapShader mBG = BitmapShader(src, Shader.TileMode.REPEAT,
                Shader.TileMode.REPEAT);
paint.setShader(mBG);
RectF rectF = new RectF(0, 0, width, height);
canvas.drawRoundRect(rectF, mContext.getResources().getDimension(R.dimen.margin_6), mContext.getResources().getDimension(R.dimen.margin_6), paint);
paint.setShader(null);

稍微写写,肯定不好,因为我还没用过🐶。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值