关于Glide 看这一篇就够了

Google推荐的图片加载库,专注于流畅的滚动。

至于Glide的优点大家可以看我另外一篇博客
下面就直接开始Glide的使用

compile 'com.github.bumptech.glide:glide:3.7.0'

然后在需要使用加载图片的地方加入

Glide.with(mContext) 
     .load(path)
     .asGif()
     .override(200,200)
     .diskCacheStrategy(DiskCacheStrategy.SOURCE)
     .placeholder(R.mipmap.loading_image)
     //.thumbnail(1f)
     .crossFade() 
     .error(R.mipmap.error)
     .transform(new GlideCircleTransform(mContext))
     .into(mImageView);

其中的方法根据自己需要选择使用,是不是觉得很简单呢

  • with() 传入对象 Context,Activity,Fragment,Glide会与当前传入值的生命周期一致。
  • load() 对象: String(文件路径,网络地址),File(文件资源),Integer(资源id)。
  • asGif() 表示的gif动画,asBitmap:表示静态图。
  • diskCacheStrategy() 表示磁盘缓存策略。
    1.DiskCacheStrategy.RESULT:展示小大的图片缓存
    2.DiskCacheStrategy.ALL; 展示在控件中大小图片尺寸和原图都会缓存
    3.DiskCacheStrategy.NONE:不设置缓存
    4.DiskCacheStrategy.SOURCE:原图缓存
  • override() 设置图片的width,height
  • placeholder() 设置占位图
  • error() 设置失败图
  • thumbnail() 缩略图显示传入值(0-1f)
  • crossFade() 显示动画-淡入淡出
  • transform() 设置图片圆角或圆形显示(继承 BitmapTransformation)这都是很常用的哦
  • centerCrop() 图片显示类型 fitCenter();
  • into() 显示到ImageView上

Glide使用案例

  1. 简单的加载图片实例
    Glide.with(this).load(imageUrl).into(imageView);
  2. 设置加载中以及加载失败图片
    Glide.with(this).load(imageUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);
  3. 设置跳过内存缓存
    Glide.with(this).load(imageUrl).skipMemoryCache(true).into(imageView);
  4. 设置下载优先级
    Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);
  5. 设置缓存策略
    Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);
  6. 设置加载动画
    Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);
    R.anim.item_alpha_in
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
      <alpha 
        android:duration="500"
        android:fromAlpha="0.0"
        android:toAlpha="1.0"/>
</set>
  1. 设置缩略图支持
    Glide.with(this).load(imageUrl).thumbnail(0.1f).into(imageView);
  2. 设置监听请求接口
Glide.with(this).load(imageUrl).listener(new RequestListener<String, GlideDrawable>() {
        @Override
        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
             return false;
        }
        @Override
        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target,  boolean isFromMemoryCache, boolean isFirstResource) {
            //imageView.setImageDrawable(resource);
            return false;
        }
 }).into(imageView);
  1. 设置动态转换---显示圆角图/原形图
    -- 圆形图
/**
 * Glide-所使用显示圆形图片的转换类
 */
static 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;
        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
        Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        }
        Canvas canvas = new Canvas(result);
        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();
    }
}

然后Glide.with(this).load(imageUrl).transform(new GlideCircleTransform(this)).into(imageView);

-- 圆角图

/**
 * Glide-显示圆角图片的转换类
 */
static class GlideRoundTransform extends BitmapTransformation {
    private float radius = 0f;
    public GlideRoundTransform(Context context) {
        this(context, 4);
    }
    public GlideRoundTransform(Context context, int radiusDp) {
        super(context);
        this.radius = Resources.getSystem().getDisplayMetrics().density * radiusDp;
    }
    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return roundCrop(pool, toTransform);
    }
    private Bitmap roundCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;
        Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        }
        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
        canvas.drawRoundRect(rectF, radius, radius, paint);
        return result;
    }
    @Override
    public String getId() {
        return getClass().getName() + Math.round(radius);
    }
}

然后Glide.with(this).load(imageUrl).transform(new GlideRoundTransform(this)).into(imageView);

使用建议--务必要自己写个ImageLoader类,例如

/** 
 * 全局的Image显示管理--Glide 
 * Created by 王元_Trump on 2016/1/24. 
 */
public class ImageLoader {
    public static final String ANDROID_RESOURCE = "android.resource://";
    public static final int IMAGE_LOADING = R.color.light_gray;   //loading占位图
    public static final int IMAGE_ERROR = R.color.light_gray;  //error图
    // 将资源ID转为Uri
    public static Uri resourceIdToUri(Context mContext, int resourceId) {
        return Uri.parse(ANDROID_RESOURCE + mContext.getPackageName() + "/" + resourceId);
    }    
// 加载网络图片
    public static void displayByUrl(Context mContext, String url, ImageView imageView) {
        Glide.with(mContext)
                .load(url)
                .placeholder(IMAGE_LOADING)
                .error(IMAGE_ERROR)
                .crossFade()   //淡入淡出
                .into(imageView);
    }
    // 加载drawable图片
    public static void displayByRes(Context mContext, int resId, ImageView imageView) {
        Glide.with(mContext)
                .load(resourceIdToUri(mContext, resId))
                .placeholder(IMAGE_LOADING)
                .error(IMAGE_ERROR)
                .crossFade()
                .into(imageView);
    }
    // 加载本地图片
    public static void displayByLocal(Context mContext, String path, ImageView imageView) {
        Glide.with(mContext)
                .load("file://" + path)
                .placeholder(IMAGE_LOADING)
                .error(IMAGE_ERROR)
                .crossFade()
                .into(imageView);
    }
}
设置Glide显示的Bitmap格式,默认是RGB_565
第一步
public class GlideConfiguration implements GlideModule {
   @Override
   public void applyOptions(Context context, GlideBuilder builder) {
     //设置图片的显示格式ARGB_8888
     builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
     //设置磁盘缓存目录
     //StringdownloadDirectoryPath=Environment.getExternalStorageDirectory() +Contents.MY_GLIDE_DISK;
     //int cacheSize100MegaBytes = 100000000;
     //glideBuilder.setDiskCache( new DiskLruCacheFactory(downloadDirectoryPath, cacheSize100MegaBytes) );
   } 
  @Override
  public void registerComponents(Context context, Glide glide) {
     // register ModelLoaders here.
  }
 } 
第二步

在AndroidManifest.xml中定义meta-data

<meta-data
 android:name=".config.GlideConfiguration"
 android:value="GlideModule"/>

Glide使用中常见的问题

一、为什么 有的图片第一次加载的时候只显示占位图,第二次才显示正常的图片呢?

  • 方案一: 不设置占位
  • 方案二:使用如下的代码加载图片:
Glide.with(mContext)
    .load(url) 
    .placeholder(R.drawable.loading_spinner)
    .into(new SimpleTarget<Bitmap>(width, height) {
        @Override 
        public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
            // setImageBitmap(bitmap) on CircleImageView 
        } 
    };
  • 方案三:使用Glide的Transformation API自定义圆形Bitmap的转换。(如果你刚好使用了这个圆形Imageview库或者其他的一些自定义的圆形Imageview,而你又刚好设置了占位的话)

二、为什么会偶尔看到类似于"You cannot start a load for a destroyed activity"的异常呢?

  • 当你的图片还在loaidng, 或者你在asynctask里面的 post 里去 加载图片,当async 还在跑时, 你back, finish 了你的activity,那么就报错了。所以请记住一句话: 不要再非主线程里面使用Glide加载图片,如果真的使用了,请把context参数换成getApplicationContext()。这里是解决方案

另外Glide还提供了清除缓存的实现

  • Glide.get(context).clearDiskCache();(清除磁盘缓存) 必须在子线程
  • Glide.get(context).clearMemory();(清除内存缓存) 必须在主线程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容