Glide 从0到1

34 篇文章 0 订阅

1. 常见图片库:GlideFrescoPicassoUniversal Image Loader

Glide: 支持Gif、WebPGoogle 推荐

Picasso: Square开源只缓存原始尺寸图片

Fresco: Facebook开源使用较复杂库包体积偏大(2-3M)

Glide和Picasso用法类似,Glide更流畅速度更快,功能更强大,但库相比Picasso更大,方法数更多。细节可参考 点我查看

2. Glide使用

标签:GIF默认HttpUrlConnection切换Volley切换OkHttp

Min SDK Version: API 14
Compile SDK Version: API 27或更高
Support Library Version: Glide使用的支持库版本为27

2.1 基本用法: 关键三步走:先with(),再load(),最后into()。熟记这三步,你就已经入门Glide了

// with()可接收Context、Activity 或 Fragment参数,也可传入全局Application
// 传入实例会决定Glide加载图片的生命周期,若传入的是Activity或Fragment实例
// 那么当这个Activity或Fragment被销毁时,图片加载也会停止。
// 若传入的是Application,那么只有当应用程序被杀掉的时候,图片加载才会停止
Glide.with(mContext)
        .load(url)// Glide支持加载各种图片资源,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等
        .skipMemoryCache(true)// 禁用内存缓存
        // .asBitmap() // Glide可自动判断加载Bitmap或gif。
        .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);

2.2 高级用法: 非View目标,如何自定义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);
}

使用自定义 Target 有一些陷阱,所以请务必阅读目标文档页的详细内容

2.3 回调与监听:(例如:当下载图片单独处理处理时)

    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

2.4 如何自定义: 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" />

参考链接

2.5 如何实现带进度条的效果

参考链接

2.6 了解Glide的一些原理和细节

  • Glide如何在当前页面退出时,中止当前页面图片下载的?
    答案是通过在当前页面创建一个隐藏的Fragment来获知页面是否退出的

  • Glide缓存有几种策略?
    内存缓存外加磁盘缓存

  • Glide如何预加载图片

Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.SOURCE)
     .preload();

3.使用踩过的坑

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

  • 如果使用了其他的一些自定义的圆形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 
        } 
    };
  • 在使用Glide给imageview加载图片的过程用不能使用view的setTag方法,否则会出现问题,如果要使用最好使用setTag(int,object)方法

4.阅读源码

4.1 with()

得到一个RequestManager对象

4.2 Glide中的图片缓存key的生成是通过一个散列算法来实现的,所以很难手动去删除指定的图片缓存

Glide的图片缓存都有对应的唯一标识符,如果是相同的,就不加载调用缓存

5.参考

  1. Glide不重新加载图片的问题
  2. Android图片加载框架最全解析(一),Glide的基本用法
  3. Glide的更详细的用法和介绍可以参考
  4. 参考文章1
  5. Glide GitHub官网
  6. Glide官方中文文档
  7. 爱走捷径的直接看这篇足以
  8. https://blog.csdn.net/github_33304260/article/details/70213300 (几个图片库比较)
  9. https://blog.csdn.net/github_33304260/article/details/70237052
  10. Glide使用总结
  11. Glide 这样用,更省内存!!!
  12. 基于 Glide V4.9.0 封装的图片加载库,可以监听加载图片时的进度
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初心一点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值