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())

注:又跳过了一个坑。。。。。。。。。。。。。。。。。。。。

猜你喜欢

转载自blog.csdn.net/s297165331/article/details/85049321