Glide图片加载库的使用
(转自:Android开发中文站 » Glide图片加载库的使用)
Glide是 Google推荐的图片加载库,它可以支持来自url,Android资源,文件,Uri中的图片加载,同时还支持gif图片的加载,以及各种图片显示前的bitmap处理(例如:圆角图片,圆形图片,高斯模糊,旋转,灰度等等),缓存处理,请求优先级处理,动画处理,缩略图处理,图片大小自定义等等.可谓是非常的强大.
1.添加Glide库
需要在build.gradle中加入依赖,目前最新的版本是3.7.0,Glide库地址
compile 'com.github.bumptech.glide:glide:3.7.0'
2.加载网络图片
**
* 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中
}
} |
3.加载资源图片
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);
}
}
|
4.加载本地文件图片
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);
}
}
|
5.从Uri中加载
/**
* 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);
}
}
|
6.加载gif图片
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);
}
}
|
效果图:
7.设置默认图片和加载失败时显示的图片
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);
}
} |
8.淡入显示效果
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()方法设置.
9.调整图片像素大小
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);
}
} |
10.设置CenterCrop,FitCenter
CenterCrop,FitCenter都是对目标图片进行裁剪,了解过ImageView的ScaleType属性就知道,这2种裁剪方式在ImageView上也是有的,分别对应ImageView的ImageView.ScaleType.CENTER_CROP和mageView.ScaleType.FIT_CENTER的.
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);
}
}
|
11.缓存策略设置
内存缓存设置,通过skipMemoryCache(boolean)来设置是否需要缓存到内存,默认是会缓存到内存的.
/**
* 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种模式:
- DiskCacheStrategy.NONE:什么都不缓存
- DiskCacheStrategy.SOURCE:仅缓存原图(全分辨率的图片)
- DiskCacheStrategy.RESULT:仅缓存最终的图片,即修改了尺寸或者转换后的图片
- DiskCacheStrategy.ALL:缓存所有版本的图片,默认模式
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);
}
}
|
12.缓存设置
在GlideModule 中,我们可以设置磁盘缓存的位置,磁盘缓存的大小和内存缓存的大小,同时还可以设置图片的显示质量.
要是用GlideModule ,需要创建它的实现类,然后在manifests中申明实现类的全类路径:
< meta-data
android:name = "com.example.mchenys.httputilsdemo.image.glide.module.SimpleGlideModule"
android:value = "GlideModule" /> |
GlideModule 的实现类,需要实现applyOptions方法:
/**
* 所以你知道要创建一个额外的类去定制 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) {
}
} |
13.设置图片请求的优先级
Glide 可以用 Priority 枚举来设置图片的加载优先级,这样我们就可以针对那些需要显示的图片设置高的优先级了.
Priority 有4种级别:
- Priority.LOW
- Priority.NORMAL
- Priority.HIGH
- Priority.IMMEDIATE
例如:
/**
* 高优先级加载
* @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);
}
}
|
14.设置加载缩略图
通过设置缩略图,我们可以在显示目标图片之前先展示一个第分辨率或者其他图片,当全分辨率的目标图片在后台加载完成后,
Glide会自动切换显示全像素的目标图片.
设置缩略图有2种方式:
通过thumbnail(float)指定0.0f~1.0f的原始图像大小,例如全像素的大小是500*500,如果设置为thumbnail为0.1f,即目标图片的10%,显示的缩略图大小就是50*50;
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,资源)加载.
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);
}
15,设置圆角
public 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 static 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;
// TODO this could be acquired from the pool too 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(); } }
自定义一个extend BitmapTransformation的方法,把获得的bitmap转化成圆形图片,下面是使用方法
private RequestManager glideRequest; glideRequest = Glide.with(this); glideRequest.load("https://www.baidu.com/img/bdlogo.png").transform(new GlideCircleTransform(context)).into(imageView);
这里不得不强调下Glide的一个强大的功能,当你在With后面的传Activity或者Fragment,Glide就可以根据当前Activity或者Fragment的生命周期维护图片的生命周期,比如但activity销毁的时候,就会自动取消需要加载的图片 下载图片转换层圆角图片的方法
public class GlideRoundTransform extends BitmapTransformation {
private static float radius = 0f;
public GlideRoundTransform(Context context) { this(context, 4); }
public GlideRoundTransform(Context context, int dp) { super(context); this.radius = Resources.getSystem().getDisplayMetrics().density * dp; }
@Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return roundCrop(pool, toTransform); }
private static 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); } }
在这个方法里面,你可以自定义圆角的大小,使用方式也非常简单
glideRequest.load("https://www.baidu.com/img/bdlogo.png").transform(new GlideRoundTransform(context)).into(imageView);
glideRequest.load("https://www.baidu.com/img/bdlogo.png").transform(new GlideRoundTransform(context, 10)).into(imageView);
|
1.添加Glide库
需要在build.gradle中加入依赖,目前最新的版本是3.7.0,Glide库地址
compile 'com.github.bumptech.glide:glide:3.7.0'
2.加载网络图片
/**
* 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中
}
}
|
3.加载资源图片
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);
}
} |
4.加载本地文件图片
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);
}
} |
5.从Uri中加载
/**
* 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);
}
} |
6.加载gif图片
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);
}
}
|
效果图: