Glide知识点梳理

Android常用图片库:Glide、Fresco

  1. 图片库比较

Fresco:Facebook出品,
功能强大,使用较复杂,对图片的转换不好处理,占用内存较低,能有效避免图片OOM。体积偏大
Glide和Picasso用法类似,Glide更流畅速度更快,功能更强大,但库相比Picasso更大,方法数更多。细节可参考 http://blog.csdn.net/richiezhu/article/details/46968569

  1. 今天来学习下Glide (3.7.0版Glide)

第一步:怎么用?关键三步走:先with(),再load(),最后into()。熟记这三步,你就已经入门Glide了

// with()可接收Context、Activity 或 Fragment参数,也可传入全局Application
// 传入实例会决定Glide加载图片的生命周期,若传入的是Activity或Fragment实例
// 那么当这个Activity或Fragment被销毁时,图片加载也会停止。
// 若传入的是Application,那么只有当应用程序被杀掉的时候,图片加载才会停止
Glide.with(mContext)
// Glide支持加载各种图片资源,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等
        .load(url)
        // 禁用内存缓存
        .skipMemoryCache(true)
        // Glide可自动判断加载Bitmap或gif。
        // .asBitmap()
        .asGif()
        .placeholder(R.drawable.loading_spinner)
        // 图片加载失败占位图
        .error(R.drawable.net_error)
        // 禁用缓存
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        // 调用crossFade方法在加载图片的过程中会有动画效果,体验更好
        .crossFade()
        .into(mTargetView);
        
// 加载本地图片
File file = new File(getExternalCacheDir() + "/image.jpg");
Glide.with(this).load(file).into(imageView);

// 加载应用资源
int resource = R.drawable.image;
Glide.with(this).load(resource).into(imageView);

// 加载二进制流
byte[] image = getImageBytes();
Glide.with(this).load(image).into(imageView);

// 加载Uri对象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(imageView);
 

第二步:还是怎么用?如何自定义Target(ViewTarget和SimpleTarget)

SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() {
    @Override
    public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
        // TODO 
    }
};

public void loadImage(View view) {
    Glide.with(this)
         .load(url)
         .into(simpleTarget);
}


第三步:还是怎么用?Glide回调与监听(例如:当下载图片单独处理处理时)

    Glide.with(this)
            .load(url)
            .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) {
                    return false;
                }
            })
            .into(imageView);

第四步:如何展示下载后处理成圆角,圆形,模糊等图片

Glide.with(this)
     .load(url)
     .transform(...)
     .into(imageView);

这里附上一个图片变换库:https://github.com/wasabeef/glide-transformations

第五步:如何自定义Glide相关配置,以及替换网络请求库

public class MyGlideModule implements GlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // 这是自定义图片缓存位置
        builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
    }

    @Override
    public void registerComponents(Context context, Glide glide) {

    }

}

// 最后在AndroidManifest.xml文件里面添加
<meta-data
    android:name="com.yourpackagename.MyGlideMoudle"
    android:value="GlideModule" />

老规矩,参考链接:https://blog.csdn.net/guolin_blog/article/details/78179422

第六步:Glide如何实现带进度条的效果

参考链接:https://blog.csdn.net/guolin_blog/article/details/78357251

第七步:了解Glide的一些原理和细节

  1. Glide如何在当前页面退出时,中止当前页面图片下载的?

答案是通过在当前页面创建一个隐藏的Fragment来获知页面是否退出的

  1. Glide缓存有几种策略?

内存缓存外加磁盘缓存

  1. Glide如何预加载图片
Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.SOURCE)
     .preload();

第八步:使用踩过的坑

  1. Glide可以加载图片和gif动画,如果想将gif加载为一张静态图片,可以调用。asBitmap()
  2. 当列表在滑动的时候,调用pauseRequests()取消请求,滑动停止时,调用resumeRequests()恢复请求。当你想清除掉所有的图片加载请求时,可以调用Glide.clear()
  3. Glide有时加载不出来图片有可能是因为图片缓存机制的问题,可以调用.override(int, int)方法加载并缓存指定大小图片
  4. 使用Glide加载圆角图片使用方法如下
Glide.with(context)
.load(pe.img_url)
// 如果要实现更复杂的图片变换则要重写BitmapTransformation这个类,或者使用glide-transformations这个glide的增强库
// bitmapTransform方法传入的参数为BitmapTransformation的对象
// 实现自己的图片转换需要继承这个类,并重写它的transform方法
// 加载圆形的图片使用CropCircleTransformation这个类
// 在加载圆角图片的过程中,CropTransformation,使用这个类除了实现圆角图片之外,可以指定显示图片的部位,比如上半部分或者中间部分等
.bitmapTransform(new RoundTrans(context, 5))
.into(mTargetView);

  1. 如果使用了其他的一些自定义的圆形Imageview,而你又刚好设置了占位的话,那么可能出现有的图片第一次加载的时候只显示占位图,第二次才显示正常的图片
  1. 解决方案一: 不设置占位;
  2. 使用Glide的Transformation API自定义圆形Bitmap的转换。这里是一个已有的例子;http://stackoverflow.com/questions/25278821/how-do-rounded-image-with-glide-library
  3. 使用下面的代码加载图片:
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 
        } 
    };
  1. 在使用Glide给imageview加载图片的过程用不能使用view的setTag方法,否则会出现问题,如果要使用最好使用setTag(int,object)方法

参考链接:

  1. https://blog.csdn.net/guolin_blog/article/details/53759439
  2. Glide的更详细的用法和介绍可以参考 http://mrfu.me/2016/02/27/Glide_Getting_Started/
  3. https://iwatching.github.io/blog/%E6%A1%86%E6%9E%B6/2018/05/12/frame4.html
  4. https://github.com/bumptech/glide
  5. https://blog.csdn.net/guolin_blog/article/details/78582548 (爱走捷径的直接看这篇足以)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容