(转自:Android开发中文站 »Glide图片加载库的使用)
Glide是 Google推荐的图片加载库,它可以支持来自url,Android资源,文件,Uri中的图片加载,同时还支持gif图片的加载,以及各种图片显示前的bitmap处理(例如:圆角图片,圆形图片,高斯模糊,旋转,灰度等等),缓存处理,请求优先级处理,动画处理,缩略图处理,图片大小自定义等等.可谓是非常的强大.
需要在build.gradle中加入依赖,目前最新的版本是3.7.0,Glide库地址
compile 'com.github.bumptech.glide:glide:3.7.0'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/**
* Created by mChenys on 2016/6/6.
*/
public
class
TestGlideActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
String url =
"http://www.qq745.com/uploads/allimg/141106/1-141106153Q5.png"
;
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(
this
).
load(url).
asBitmap().
//强制处理为bitmap
into(targetView);
//显示到目标View中
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
class
TestGlideActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
int
resourceId = R.drawable.test;
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(
this
).
load(resourceId).
asBitmap().
into(targetView);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
class
TestGlideActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
File file =
new
File(Environment.getExternalStorageDirectory(),
"test.jpg"
);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(
this
).
load(file).
asBitmap().
into(targetView);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/**
* Created by mChenys on 2016/6/6.
*/
public
class
TestGlideActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
Uri uri = Uri.parse(
"android.resource://"
+
this
.getPackageName() +
"/"
+ R.drawable.test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(
this
).
load(uri).
asBitmap().
into(targetView);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
|
public
class
TestGlideActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(
this
).
load(R.drawable.smail).
asGif().
//注意:这里显示的指明了要加载的是gif图片,当然即使不指明,glide也会自己判断.
into(targetView);
}
}
|
效果图:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
class
TestGlideActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(
this
).
load(R.drawable.test).
asBitmap().
placeholder(R.drawable.bg_loading).
//加载中显示的图片
error(R.drawable.bg_error).
//加载失败时显示的图片
into(targetView);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
class
TestGlideActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(
this
).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).
//加载中显示的图片
error(R.drawable.bg_error).
//加载失败时显示的图片
crossFade().
//淡入显示,注意:如果设置了这个,则必须要去掉asBitmap
into(targetView);
}
}
|
另外,crossFade还可以接收一个参数来设置淡入显示效果的持续时间,crossFade(int duration);
如果你想直接显示图片,而不是淡入显示图片,则可以通过dontAnimate()方法设置.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public
class
TestGlideActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(
this
).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).
//加载中显示的图片
error(R.drawable.bg_error).
//加载失败时显示的图片
crossFade(
1000
).
//淡入显示的时间,注意:如果设置了这个,则必须要去掉asBitmap
override(
80
,
80
).
//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高
into(targetView);
}
}
|
CenterCrop,FitCenter都是对目标图片进行裁剪,了解过ImageView的ScaleType属性就知道,这2种裁剪方式在ImageView上也是有的,分别对应ImageView的ImageView.ScaleType.CENTER_CROP和mageView.ScaleType.FIT_CENTER的.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public
class
TestGlideActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
Glide.with(
this
).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).
//加载中显示的图片
error(R.drawable.bg_error).
//加载失败时显示的图片
crossFade(
1000
).
//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap
override(
80
,
80
).
//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高
centerCrop().
//中心裁剪,缩放填充至整个ImageView
into(targetView);
}
}
|
内存缓存设置,通过skipMemoryCache(boolean)来设置是否需要缓存到内存,默认是会缓存到内存的.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/**
* Created by mChenys on 2016/6/6.
*/
public
class
TestGlideActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
Glide.with(
this
).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).
//加载中显示的图片
error(R.drawable.bg_error).
//加载失败时显示的图片
crossFade(
1000
).
//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap
override(
80
,
80
).
//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高
centerCrop().
//中心裁剪,缩放填充至整个ImageView
skipMemoryCache(
true
).
//跳过内存缓存
into(targetView);
}
}
|
磁盘缓存,磁盘缓存通过diskCacheStrategy(DiskCacheStrategy)来设置,DiskCacheStrategy一共有4种模式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
class
TestGlideActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
Glide.with(
this
).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).
//加载中显示的图片
error(R.drawable.bg_error).
//加载失败时显示的图片
crossFade(
1000
).
//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap
override(
80
,
80
).
//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高
centerCrop().
//中心裁剪,缩放填充至整个ImageView
skipMemoryCache(
true
).
//跳过内存缓存
diskCacheStrategy(DiskCacheStrategy.RESULT).
//保存最终图片
into(targetView);
}
}
|
在GlideModule 中,我们可以设置磁盘缓存的位置,磁盘缓存的大小和内存缓存的大小,同时还可以设置图片的显示质量.
要是用GlideModule ,需要创建它的实现类,然后在manifests中申明实现类的全类路径:
1
2
3
|
<
meta-data
android:name
=
"com.example.mchenys.httputilsdemo.image.glide.module.SimpleGlideModule"
android:value
=
"GlideModule"
/>
|
GlideModule 的实现类,需要实现applyOptions方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
/**
* 所以你知道要创建一个额外的类去定制 Glide。
* 下一步是要全局的去声明这个类,让 Glide 知道它应该在哪里被加载和使用。
* Glide 会扫描 AndroidManifest.xml 为 Glide module 的 meta 声明。
* 因此,你必须在 AndroidManifest.xml 的 <application> 标签内去声明这个SimpleGlideModule。
* Created by mChenys on 2016/6/10.
*/
public
class
SimpleGlideModule
implements
GlideModule {
public
static
DiskCache cache;
@Override
public
void
applyOptions(Context context, GlideBuilder builder) {
// 在 Android 中有两个主要的方法对图片进行解码:ARGB8888 和 RGB565。前者为每个像素使用了 4 个字节,
// 后者仅为每个像素使用了 2 个字节。ARGB8888 的优势是图像质量更高以及能存储一个 alpha 通道。
// Picasso 使用 ARGB8888,Glide 默认使用低质量的 RGB565。
// 对于 Glide 使用者来说:你使用 Glide module 方法去改变解码规则。
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
//设置缓存目录
File cacheDir = PathUtils.getDiskCacheDir(context, CacheConfig.IMG_DIR);
cache = DiskLruCacheWrapper.get(cacheDir, DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE);
// 250 MB
builder.setDiskCache(
new
DiskCache.Factory() {
@Override
public
DiskCache build() {
return
cache;
}
});
//设置memory和Bitmap池的大小
MemorySizeCalculator calculator =
new
MemorySizeCalculator(context);
int
defaultMemoryCacheSize = calculator.getMemoryCacheSize();
int
defaultBitmapPoolSize = calculator.getBitmapPoolSize();
int
customMemoryCacheSize = (
int
) (
1.2
* defaultMemoryCacheSize);
int
customBitmapPoolSize = (
int
) (
1.2
* defaultBitmapPoolSize);
builder.setMemoryCache(
new
LruResourceCache(customMemoryCacheSize));
builder.setBitmapPool(
new
LruBitmapPool(customBitmapPoolSize));
}
@Override
public
void
registerComponents(Context context, Glide glide) {
}
}
|
Glide 可以用 Priority 枚举来设置图片的加载优先级,这样我们就可以针对那些需要显示的图片设置高的优先级了.
Priority 有4种级别:
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
/**
* 高优先级加载
* @param url
* @param imageView
* @param listener
*/
public
static
void
loadImageWithHighPriority(Object url,ImageView imageView,
final
LoaderListener listener) {
if
(url ==
null
) {
if
(listener !=
null
) {
listener.onError();
}
}
else
{
Glide.with(imageView.getContext()).
load(url).
asBitmap().
priority(Priority.HIGH).
//高优先级
dontAnimate().
listener(
new
RequestListener<Object, Bitmap>() {
@Override
public
boolean
onException(Exception e, Object model, Target<Bitmap> target,
boolean
isFirstResource) {
if
(
null
!= listener) {
listener.onError();
}
return
false
;
}
@Override
public
boolean
onResourceReady(Bitmap resource, Object model, Target<Bitmap> target,
boolean
isFromMemoryCache,
boolean
isFirstResource) {
if
(
null
!= listener) {
listener.onSuccess();
}
return
false
;
}
}).into(imageView);
}
}
|
通过设置缩略图,我们可以在显示目标图片之前先展示一个第分辨率或者其他图片,当全分辨率的目标图片在后台加载完成后,
Glide会自动切换显示全像素的目标图片.
设置缩略图有2种方式:
通过thumbnail(float)指定0.0f~1.0f的原始图像大小,例如全像素的大小是500*500,如果设置为thumbnail为0.1f,即目标图片的10%,显示的缩略图大小就是50*50;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public
class
TestGlideActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(
this
).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).
//加载中显示的图片
error(R.drawable.bg_error).
//加载失败时显示的图片
crossFade(
1000
).
//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap
override(
80
,
80
).
//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高
centerCrop().
//中心裁剪,缩放填充至整个ImageView
skipMemoryCache(
true
).
//跳过内存缓存
diskCacheStrategy(DiskCacheStrategy.RESULT).
//保存最终图片
thumbnail(
0
.1f).
//10%的原图大小
into(targetView);
}
}
|
通过thumbnail(DrawableRequestBuilder)方式来指定缩略图,该缩略图可以使用load的所有方式(网络,文件,uri,资源)加载.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public
class
TestGlideActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
//缩略图请求
DrawableRequestBuilder<String> thumbnailRequest = Glide
.with(
this
)
.load(
"http://www.qq745.com/uploads/allimg/141106/1-141106153Q5.png"
);
Glide.with(
this
).
load(R.drawable.test).
// placeholder(R.drawable.bg_loading).//加载中显示的图片
// error(R.drawable.bg_error).//加载失败时显示的图片
// crossFade(1000).//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap
override(
80
,
80
).
//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高
centerCrop().
//中心裁剪,缩放填充至整个ImageView
skipMemoryCache(
true
).
//跳过内存缓存
diskCacheStrategy(DiskCacheStrategy.RESULT).
//保存最终图片
thumbnail(thumbnailRequest).
//设置缩略图
into(targetView);
}
}
|
接下篇:Glide图片加载库的使用(二)