Glide图片加载库

20 Jul 2016

之所以更换Glide而不用Picasso,是因为Glide支持GIF动态图片。

下面简单介绍下Glide的使用。(基于Android Studio)

依赖

dependencies {
    compile 'com.github.bumptech.glide:glide:3.5.2'
    compile 'com.android.support:support-v4:22.0.0'
}

加载一般图片

public static void loadImage(
                   Context context, String url, ImageView mImageView) {
        if (context == null || TextUtils.isEmpty(url) 
                            || mImageView == null) {
            return;
        }
        String oldTag = (String) mImageView.getTag(R.id.glide_tag_id);
        if (TextUtils.isEmpty(oldTag) || !oldTag.equalsIgnoreCase(url)) {
            mImageView.setTag(R.id.glide_tag_id, url);
            Glide.with(context).load(url)
                    .diskCacheStrategy(DISK_CACHE_STRATEGY)
                    .fitCenter()
                    .placeholder(E_CARD_BG)
                    .dontAnimate()
                    .into(mImageView);
        }
    }
Glide.with支持Context、Activity、FragmentActivity、Fragment,最好选用有生命周期的对象。
mImageView.setTag是为了防止多次加载相同图片的时候闪烁。
缓存类型DISK_CACHE_STRATEGY为:
DiskCacheStrategy DISK_CACHE_STRATEGY = DiskCacheStrategy.SOURCE;
在res-values-ids.xml里glide_tag_id为:
<item name="glide_tag_id" type="id" />

加载圆形图片

需要添加属性:
.transform(new GlideCircleTransform(context, isHaveBorder))
GlideCircleTransform为自定义对象,继承BitmapTransformation。
public class GlideCircleTransform extends BitmapTransformation {

    public GlideCircleTransform(Context context) {
        super(context);
       
    }

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

    private Bitmap circleCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;

        int size = Math.min(source.getWidth(), source.getHeight());
        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;
        // TODO this could be acquired from the pool too
        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);

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

        Canvas canvas = new Canvas(result);
        canvas.setDrawFilter(
               new PaintFlagsDrawFilter(
                   0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
        Paint paint = new Paint();
        paint.setShader(
              new BitmapShader(
                  squared, BitmapShader.TileMode.CLAMP, 
                  BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);
        
        return result;
    }

    @Override
    public String getId() {
        return getClass().getName();
    }
}
对canvas进行修改,就能达到你想要的效果。

清理缓存

清除物理缓存需要在非主线程上进行。
清除内存缓存需要在主线程上进行。
public static void clearCache(Context context) {
        if (context != null) {
            final Glide mGlide = Glide.get(context);
            if (mGlide != null) {
                mGlide.clearMemory();
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        mGlide.clearDiskCache();
                    }
                }).start();
            }

        }
    }

    public static void clearMemoryCache(Context context) {
        if (context != null) {
            Glide mGlide = Glide.get(context);
            if (mGlide != null) {
                mGlide.clearMemory();
            }
        }
    }

参考文献:
https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en