WTFGlide 4.x 如何生成边框

Glide 4.x 中自定义转换器 发生了更改原来的 getId 已经无效了 必须重写如下方法 至于为啥 官网文档。。。

 @Override
    public boolean equals(Object o) {
        return o instanceof GlideCircleTransform;
    }

    @Override
    public int hashCode() {
        return ID.hashCode();
    }

    @Override
    public void updateDiskCacheKey(MessageDigest messageDigest) {
        messageDigest.update(ID_BYTES);
    }

完整的圆形边框就是下面这样了 时间比较有限啊 就不细说了

效果图
下面是代码
​​​​​​


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;

import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
import com.bumptech.glide.util.Util;

import java.nio.ByteBuffer;
import java.security.MessageDigest;

/**
 * glide加载圆形图片的实现
 */
public class GlideCircleTransform extends BitmapTransformation {
    private Context context;
    private int mBorderColor;
    private int mBorderWidth;
    Paint mBorderPaint;
    //id 必须为this.getClass().getName(); 唯一id
    private String ID = this.getClass().getName();
    private byte[] ID_BYTES = ID.getBytes(CHARSET);

    public GlideCircleTransform(Context context) {
        super();
        this.context = context;
    }

    /**
     * @param context
     * @param bordColor 边框颜色
     * @param bordWidth 边框宽度
     */
    public GlideCircleTransform(Context context, int bordColor, int bordWidth) {
        super();
        this.context = context;
        this.mBorderColor = bordColor;
        this.mBorderWidth = bordWidth;
        mBorderPaint = new Paint();
        mBorderPaint.setStyle(Paint.Style.STROKE);
        mBorderPaint.setAntiAlias(true);
        mBorderPaint.setColor(mBorderColor);
        //代码里默认px
        mBorderPaint.setStrokeWidth(mBorderWidth);
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return circleCrop(pool, toTransform);
    }

    private Bitmap circleCrop(BitmapPool pool, Bitmap source) {

        int size = Math.min(source.getWidth() - mBorderWidth * 2, source.getHeight() - mBorderWidth * 2);

        int width = (source.getWidth() - size) / 2;
        int height = (source.getHeight() - size) / 2;

        Bitmap bitmap = pool.get(size, size, Bitmap.Config.ARGB_8888);
        if (bitmap == null) {
            bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        BitmapShader shader = new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
        if (width != 0 || height != 0) {
            Matrix matrix = new Matrix();
            matrix.setTranslate(-width, -height);
            shader.setLocalMatrix(matrix);
        }
        paint.setShader(shader);
        paint.setAntiAlias(true);
        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);

        if (mBorderWidth > 0) {
            int mBorderRadius = (size - mBorderWidth) / 2;
            canvas.drawCircle(r, r, mBorderRadius, mBorderPaint);
        }
        return bitmap;
    }


    @Override
    public boolean equals(Object o) {
        if (o instanceof GlideCircleTransform) {
            GlideCircleTransform circleTransform = (GlideCircleTransform) o;
            /*其实这里可以直接返回true仿照官网写。。。做个比较混淆一下视听*/
            return (mBorderColor == circleTransform.mBorderColor)
                    && (mBorderWidth == circleTransform.mBorderWidth);
        }
        return false;
    }

    @Override
    public int hashCode() {
        /*Util.hashCode 只能有两个参数 所以在这里把自己定义的参数合并成一个。。有更好的办法欢迎评论*/
        return Util.hashCode(ID.hashCode(),
                Util.hashCode(Util.hashCode(mBorderWidth),
                        Util.hashCode(mBorderColor))
        );
    }

    @Override
    public void updateDiskCacheKey(MessageDigest messageDigest) {
        messageDigest.update(ID_BYTES);
        /*在这里把自己的参数也给更新一下 不然会产生某些奇怪的效果 比如宽度设置没反应*/
        byte[] color = ByteBuffer.allocate(4).putInt(mBorderColor).array();
        messageDigest.update(color);
        byte[] width = ByteBuffer.allocate(4).putInt(mBorderWidth).array();
        messageDigest.update(width);
    }
}

应用的话调用这个即可

   Glide.with(this).load(R.drawable.banner_bitmap_one)
                .apply(RequestOptions.bitmapTransform(
                        new GlideCircleTransform(this, color, 2)))
                .into(iv);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值