android glide 圆形,Android 开发:glide圆角,圆形,效率问题

1.目前能百度到的glide圆角,圆形方案都是错误的

2.实际上glide在后续的新版本里提供了圆角圆形方案。

刚开始我在做项目的时候,采用了百度到的方案,结果发现百度到的代码效率极差,尤其是在做recycleView的时候,展示图片慢成狗。

于是我重新研究了glide代码,以及官方文档。

注:以下示例

圆形:public class GlideCircleTransform extends BitmapTransformation {    private static final String ID = "com.xiaohe.www.lib.tools.glide.GlideCircleTransform";    private static final byte[] ID_BYTES = ID.getBytes(CHARSET);    @Override

protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {        int size = Math.min(toTransform.getWidth(), toTransform.getHeight());        int x = (toTransform.getWidth() - size) / 2;        int y = (toTransform.getHeight() - size) / 2;

Bitmap square = Bitmap.createBitmap(toTransform, x, y, size, size);

Bitmap circle = pool.get(size, size, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(circle);

Paint paint = new Paint();

paint.setShader(new BitmapShader(square, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));

paint.setAntiAlias(true);        float r = size / 2f;

canvas.drawCircle(r, r, r, paint);        return circle;

}    @Override

public boolean equals(Object obj) {        return obj instanceof GlideCircleTransform;

}    @Override

public int hashCode() {        return ID.hashCode();

}    @Override

public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {

messageDigest.update(ID_BYTES);

}

}

圆角:public class GlideRoundTransform  extends BitmapTransformation {    private static final String ID = "com.xiaohe.www.lib.tools.glide.GlideRoundTransform";    private static final byte[] ID_BYTES = ID.getBytes(CHARSET);    private int radius;    public GlideRoundTransform(Context context, int radius) {        this.radius = UUi.dp2px(radius);

}    @Override

protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {        int width = toTransform.getWidth();        int height = toTransform.getHeight();

Bitmap bitmap = pool.get(width, height, Bitmap.Config.ARGB_8888);

bitmap.setHasAlpha(true);

Canvas canvas = new Canvas(bitmap);

Paint paint = new Paint();

paint.setAntiAlias(true);

paint.setShader(new BitmapShader(toTransform, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));

canvas.drawRoundRect(new RectF(0, 0, width, height), radius, radius, paint);        return bitmap;

}    @Override

public boolean equals(Object obj) {        if (obj instanceof GlideRoundTransform) {

GlideRoundTransform other = (GlideRoundTransform) obj;            return radius == other.radius;

}        return false;

}    @Override

public int hashCode() {        return Util.hashCode(ID.hashCode(), Util.hashCode(radius));

}    @Override

public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {

messageDigest.update(ID_BYTES);        byte[] radiusData = ByteBuffer.allocate(4).putInt(radius).array();

messageDigest.update(radiusData);

}

}

------------------------------------------------我是分割线------------------------------------------------

解释说明:

问:为嘛这个示例效率高?????

答:这个示例明显重写了三个方法,百度到的代码都是重写了两个方法,并不能让glide运行正常!!!!

-----------------------------------------------再分割------------------------------------------------------------

其实新版本的glide提供了这两个方法

圆角:RequestOptions.bitmapTransform(new RoundedCorners( 5))

圆形:RequestOptions.bitmapTransform(new CircleCrop())

又跳过了一个坑。。。。。。。。。。。。。。。。。。。。开心

作者:王二蛋和他的狗

链接:https://www.jianshu.com/p/5c54046d2b1c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值