Glide详细使用总结

文章目录

  1. 1. Glide简单使用
    1. 1.1. 从其他源加载图片(资源文件、文件、Uri、assets、raw、ContentProvider、sd卡资源)
    2. 1.2. 占位图,错误图,和淡入淡出效果
    3. 1.3. 设置下载优先级
    4. 1.4. 设置图片大小和缩放形式
    5. 1.5. 设置动态转换,图片的形状
    6. 1.6. 设置监听请求接口
  2. 2. Glide优化方法
    1. 2.1. 清除缓存的方法
    2. 2.2. 清除掉所有的图片加载请求
    3. 2.3. 滚动加载,不滚动时不加载,提高listview效率
    4. 2.4. 图片列表预加载,提高加载速度
  3. 3. Glide3.0新特性
    1. 3.1. 动态的GIF图片加载
    2. 3.2. 本地视频快照
    3. 3.3. 对缩略图的支持
    4. 3.4. 生命周期集成
    5. 3.5. 转码
    6. 3.6. 动画:加入了cross fades和View的属性动画的支持
    7. 3.7. 网络模块可以选择OkHttp或者Volley的支持
  4. 4. 内存缓存
    1. 4.1. 设置跳过内存缓存
    2. 4.2. 设置缓存策略(磁盘缓存)
  5. 5. 在后台线程当中进行加载和缓存
  6. 6. 一些基于Glide的优秀库

Glide 是一个高效、开源、 Android设备上的媒体管理框架,它遵循BSD、MIT以及Apache 2.0协议发布。Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。

Glide简单使用

就像 Picasso、Glide 库是使用流接口(fluent interface)。对一个完整的功能请求,Glide 建造者要求最少有三个参数。

  • with(Context context) - 上下文环境
  • load(String imageUrl) - 需要加载图片的URL.
  • into(ImageView imageView) - 图片显示的ImageView.
1
Glide.with(context).load(imageUrl).into(imageView);

从其他源加载图片(资源文件、文件、Uri、assets、raw、ContentProvider、sd卡资源)

1
2
3
4
5
6
7
8
Glide.with(context).load(R.mipmap.ic_launcher).into(imageView);
Glide.with(context).load(file).into(imageView);
Uri uri = resourceIdToUri(context, R.mipmap.ic_launcher);
Glide.with(context).load("Android.resource://com.frank.glide/raw/raw_1").into(imageView);
Glide.with(context).load("android.resource://com.frank.glide/raw/"+R.raw.raw_1).into(imageView);
Glide.with(context).load("content://media/external/images/media/139469").into(imageView);
Glide.with(context).load("file:///android_asset/f003.gif").into(imageView);
Glide.with(context).load("file://"+ Environment.getExternalStorageDirectory().getPath()+"/test.jpg").into(imageView);

占位图,错误图,和淡入淡出效果

1
2
3
4
5
6
7
8
Glide
.with(context)
.load(url)
.placeholder(R.mipmap.defalut) //设置占位图
.error(R.mipmap.error) //设置错误图片
.crossFade() //设置淡入淡出效果,默认300ms,可以传参
//.dontAnimate() //不显示动画效果
.into(imageView);

设置下载优先级

• Priority.LOW
• Priority.NORMAL
• Priority.HIGH
• Priority.IMMEDIATE

1
2
3
4
5
Glide
.with(context)
.load(url)
.priority(Priority.NORMAL)
.into(imageView);

设置图片大小和缩放形式

Glide 会根据ImageView的大小,自动限制图片缓存和内存中的大小,当然也可以通过调用override(horizontalSize, verticalSize)限制图片的大小:

1
2
3
4
5
Glide
.with(context)
.load(url)
.override(200, 200)
.into(imageView);

Glide支持两种图片缩放形式,CenterCrop 和 FitCenter
CenterCrop:等比例缩放图片,直到图片的狂高都大于等于ImageView的宽度,然后截取中间的显示。

1
2
3
4
5
6
Glide
.with(context)
.load(url)
.override(200, 200)
.centerCrop()
.into(imageView);

FitCenter:等比例缩放图片,宽或者是高等于ImageView的宽或者是高。

1
2
3
4
5
6
Glide
.with(context)
.load(url)
.override(200, 200)
.fitCenter()
.into(imageView);

设置动态转换,图片的形状

[ 我的另一篇博客传送门 ]

设置监听请求接口

设置监听的用处 可以用于监控请求发生错误来源,以及图片来源 是内存还是磁盘

1
2
3
4
5
6
7
8
9
10
11
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) {
return false;
}
}).into(imageView);

Glide优化方法

清除缓存的方法

1
2
Glide.get(this).clearDiskCache();//清理磁盘缓存 需要在子线程中执行
Glide.get(this).clearMemory();//清理内存缓存 可以在UI主线程中进行

清除掉所有的图片加载请求

1
Glide.clear()

滚动加载,不滚动时不加载,提高listview效率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState){
case SCROLL_STATE_FLING:
Log.i("ListView","用户在手指离开屏幕之前,由于滑了一下,视图仍然依靠惯性继续滑动");
Glide.with(getApplicationContext()).pauseRequests();
//刷新
break;
case SCROLL_STATE_IDLE:
Log.i("ListView", "视图已经停止滑动");
Glide.with(getApplicationContext()).resumeRequests();
break;
case SCROLL_STATE_TOUCH_SCROLL:
Log.i("ListView","手指没有离开屏幕,视图正在滑动");
Glide.with(getApplicationContext()).resumeRequests();
break;
}
}

图片列表预加载,提高加载速度

在图片显示在屏幕上之前就预先取出图片。它提供了一个ListPreloader类, 它被应该事先取出的item数目实例化。然后通过setOnScrollListener(OnScrollListener).被传递给ListView。你想在ListView之外也能预先取出图片吗?没问题,使用前面的builder对象就可以了,只需调用builder.downloadOnly()。

Glide3.0新特性

动态的GIF图片加载

1
2
Glide.with(context).load(gifUrl).asBitmap().into(imageview); //显示gif静态图片
Glide.with(context).load(gifUrl).asGif().into(imageview); //显示gif动态图片

本地视频快照

1
Glide.with(context).load("视频路径/视频文件/本地视频路径").into(imageview);

对缩略图的支持

1
2
//加载1/10尺寸的缩略图,然后加载全图
Glide.with(context).load(url).thumbnail(0.1f).into(imageview)

生命周期集成

同时将Activity/Fragment作为with()参数的好处是:图片加载会和Activity/Fragment的生命周期保持一致,

  • 请求会在onStop的时候自动暂停,
  • 在onStart的时候重新启动,gif的动画也会在onStop的时候停止,以免在后台消耗电量,

转码

Glide的.toBytes()和.transcode()方法允许在后台获取、解码和转换一个图片,你可以将一张图片转换成更多有用的图片格式,比如,上传一张250*250的图片

1
2
3
4
5
6
7
8
9
10
11
12
Glide.with(context)
.load("path")
.asBitmap()
.toBytes()
.centerCrop()
.into(new SimpleTarget<byte[]>(250, 250) {
@Override
public void onResourceReady(byte[] data, GlideAnimation anim) {
// Post your bytes to a background thread and upload them here.
imageView.setImageDrawable(resource);
}
});

动画:加入了cross fades和View的属性动画的支持

1
2
3
4
5
Glide
.with( context )
.load( url )
.animate( android.R.anim.slide_in_left )
.into( imageView );

OR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ViewPropertyAnimation.Animator animationObject = new ViewPropertyAnimation.Animator() {
@Override
public void animate(View view) {
view.setAlpha( 0f );
ObjectAnimator fadeAnim = ObjectAnimator.ofFloat( view, "alpha", 0f, 1f );
fadeAnim.setDuration( 2500 );
fadeAnim.start();
}
};
Glide
.with( context )
.load( url )
.animate( animationObject )
.into( imageView );

网络模块可以选择OkHttp或者Volley的支持

Volley和OkHttp可以在gradle文件当中添加依赖,注册相应的ModelLoaderFactory

内存缓存

设置跳过内存缓存

1
2
3
4
5
Glide
.with(context)
.load(url)
.skipMemoryCache(true)
.into(imageView);

设置缓存策略(磁盘缓存)

策略解说:
all:缓存源资源和转换后的资源
none:不作任何磁盘缓存
source:缓存源资源
result:缓存转换后的资源

1
2
3
4
5
Glide
.with(context)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(imageView);

在后台线程当中进行加载和缓存

为了保证Glide在后台线程当中加载资源文件更加容易,Glide除了Glide.with(fragment).load(url).into(view)之外还提供了

1
2
3
downloadOnly(int width, int height)
downloadOnly(Y target)// Y extends Target<File>
into(int width, int height)

1.downloadOnly

Glide的downloadOnly()允许开发者将Image的二进制文件下载到硬盘缓存当中,以便在后续使用,

在UI线程当中异步下载,在异步线程当中则是使用width和height
在异步线程当中同步调用下载,在同步线程当中,
downloadOnly使用一个target作为参数
1、 在后台线程当中下载图片,可以通过如下的方式:

1
2
3
4
FutureTarget<File> future = Glide.with(applicationContext)
.load(yourUrl)
.downloadOnly(500, 500);
File cacheFile = future.get();

当future返回的时候,image的二进制文件信息就存入了disk缓存了,值得注意的是downloadOnly API只是保证图片个bytes数据在disk当中是有效的。

2、下载完毕之后如果想要进行显示,可以通过如下方式进行调用:

1
2
3
4
5
6
7
8
9
Glide.with(yourFragment)
.load(yourUrl)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(yourView);
Glide.with(yourFragment)
.load(yourUrl)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(yourView);

通过DiskCacheStrategy.ALL或者DiskCacheStrategy.SOURCE,可以保证程序会去读取缓存文件

  1. 如果想要在后台线程当中获取某个URL对应的Bitmap

不通过downloadOnly,可以使用into(),会返回一个FutureTarget对象,比如,想要得到一个URL对应的500*500的centerCrop裁剪图片,可以通过如下方式实现:

1
2
3
4
5
6
Bitmap myBitmap = Glide.with(applicationContext)
.load(yourUrl)
.asBitmap()
.centerCrop()
.into(500, 500)
.get()

注意:上面的调用只能在异步线程当中,如果在main Thread当中调用.get(),会阻塞主线

一些基于Glide的优秀库

[ 1、glide-transformations ]

一个基于Glide的transformation库,拥有裁剪,着色,模糊,滤镜等多种转换效果,赞的不行不行的~~

[ 2.GlidePalette ]

一个可以在Glide加载时很方便使用Palette的库。

更新日期: