注:本文内容主要参考了郭霖的专栏 Glide最全解析总结而成。
Glide做为一个快速高效的图片加载库,在平常的Android开发中常常会用到,下面咱们来详细介绍一下它的用法。html
配置Gradle的依赖项:
打开Glide框架的GitHub主页:https://github.com/bumptech/glide,按照介绍配置依赖项(版本号会有变化)便可:java
dependencies { implementation 'com.github.bumptech.glide:glide:4.10.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0' }
配置相关权限:
根据需求,咱们须要在AndroidManifest.xml
中配置一下相应权限。
为了加载网络图片,须要添加网络权限:android
<!--添加网络权限--> <uses-permission android:name="android.permission.INTERNET" />
为了监听网络状态,例如在设备从新链接到网络时重启以前失败的请求:git
<!--容许访问网络状态--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
为了从本地文件夹或 DCIM 或图库中加载图片,须要添加读取外部存储权限:github
<!--读取外部存储权限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
若是要使用ExternalPreferredCacheDiskCacheFactory
来将Glide的缓存存储到公有SD卡上,你还须要添加 写入外部存储的权限:缓存
<!--写入外部存储权限--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
一行代码搞定图片加载与显示:网络
Glide.with(this).load(URL).into(imageView);
固然Glide还支持加载不一样来源的图片:本地图片、应用的Resource、二进制流、Uri对象。(参考 Android图片加载框架最全解析(一),Glide的基本用法)
// 加载本地图片 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);
经过RequestOptions,咱们能够在借助Glide加载图片时优化一下用户体验:app
具体实现以下:框架
//添加占位图 RequestOptions options = new RequestOptions().placeholder(R.drawable.ic_launcher_background); //指定图片宽高 RequestOptions options2 = new RequestOptions().override(200, 300); //指定缓存机制:既缓存原始图片,也缓存转换事后的图片 RequestOptions options3 = new RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL); //进行图片变换 RequestOptions options4 = new RequestOptions().centerCrop(); RequestOptions options5 = new RequestOptions().fitCenter(); RequestOptions options6 = new RequestOptions().circleCrop(); Glide.with(MainActivity.this).load(URL).apply(options).into(imageView); //进行图片组合变换方式1 Transformation<android.graphics.Bitmap> transformation = new MultiTransformation<>(new CenterCrop(),new FitCenter()); Glide.with(MainActivity.this).load(URL).transform(transformation).into(imageView); //进行图片组合变换方式2 Glide.with(MainActivity.this).load(URL).transform(new FitCenter(),new CenterCrop()).into(imageView);
通常状况下咱们是不须要指定图片的大小的,由于Glide会根据ImageView的大小来决定图片的大小;
指定缓存机制有5种类型参数:异步
- DiskCacheStrategy.NONE:表示不缓存任何内容
- DiskCacheStrategy.DATA:表示只缓存原始图片
- DiskCacheStrategy.RESOURCE:表示只缓存转换事后的图片
- DiskCacheStrategy.ALL :表示既缓存原始图片,也缓存转换事后的图片
- DiskCacheStrategy.AUTOMATIC:表示让Glide根据图片资源智能地选择使用哪种缓存策略(默认选项)
有关自定义变换效果的内容请参考:定制变换,固然也能够引入第三方的库:glide-transformations
下面咱们能够本身封装一个工具类:
public class GlideUtil { public static void load( Context context, String url, RequestOptions options, ImageView imageView){ Glide.with(context).load(url).apply(options).into(imageView); } }
借助error方法实现请求失败时开始新的请求,须要给error方法传入一个RequestBuilder对象或本地资源(Drawable或resourceId):
Glide.with(MainActivity.this).load(primaryUrl).error(Glide.with(MainActivity.this) .load(fallbackUrl)).into(imageView);
无论咱们传入的是一张普通图片,仍是一张GIF图片,Glide都会自动进行判断,而且能够正确地把它解析并展现出来,但咱们非要指定加载的图片格式
//强制指定加载静态图片 Glide.with(MainActivity.this).asBitmap().load(URL).into(imageView); //强制指定加载动态图片 Glide.with(MainActivity.this).asGif().load(URL).into(imageView); //强制指定加载指定文件格式 Glide.with(MainActivity.this).asFile().load(URL).into(imageView); //强制以Drawable格式加载图片 Glide.with(MainActivity.this).asDrawable().load(URL).into(imageView);
into方法除了能够传入ImageView,还能够传入
//CustomTarget的具体实现 CustomTarget<Drawable> target=new CustomTarget<Drawable>() { @Override public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) { //重写的方法中能够获取到Drawable对象,这里仅仅将drawable显示出来 imageView.setImageDrawable(resource); } @Override public void onLoadCleared(@Nullable Drawable placeholder) { } }; //将图片加载到target Glide.with(MainActivity.this).load(URL).into(target);
有关target更多的用法详见: 目标
需求:对图片进行预加载,等真正要显示时直接从缓存中读取
//以原尺寸预加载 Glide.with(MainActivity.this).load(URL).preload(); //或者以指定尺寸预加载 Glide.with(MainActivity.this).load(URL).preload(200,300); //在须要加载时再从缓存中读取便可 Glide.with(MainActivity.this).load(URL).preload();
咱们借助submit方法能够只下载图片而不加载图片,
loadImageBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { downloadImage(); } }); } private void downloadImage(){ //target.get()方法会阻塞线程,因此须要单独开一个线程去获取缓存路径 new Thread(new Runnable() { @Override public void run() { try { FutureTarget<File> target = Glide.with(getApplicationContext()).asFile().load(URL).submit(); imageFile = target.get(); runOnUiThread(new Runnable() { @Override public void run() { Log.d(TAG, "下载图片缓存路径:"+imageFile.getPath()); } }); } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } } }).start(); }
打印日志以下:
下载图片缓存路径:/data/user/0/com.crazywish.glidetest/cache/image_manager_disk_cache/3e991b944c38ebc970aac3a217b7f0c6d087883d17a5f77f95d2375feacbe2d9.0
能够借助listener()方法来监听图片加载的状态:
Glide.with(MainActivity.this).load(URL) .listener(new RequestListener<Drawable>() { //图片加载失败时的回调 @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { return false; } //图片加载完成时的回调 @Override public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { return false; } }).into(imageView);
若listener方法的onResourceReady方法返回为true,则表示该事件被处理掉了,则不会继续向下传递,那么就不会回调Target的onResourceReady方法了。
建立一个类使其继承自AppGlideModule
,并实现applyOptions方法和registerComponents方法,有关具体案例请参考Android图片加载框架最全解析(六),探究Glide的自定义模块功能,这里再也不赘述。
@GlideModule public class MyAppGlideModule extends AppGlideModule{ //更改Glide配置 @Override public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) { //用于配置Glide的内存缓存策略,默认配置是LruResourceCache builder.setMemoryCache(); //用于配置Glide的Bitmap缓存池,默认配置是LruBitmapPool builder.setBitmapPool(); //用于配置Glide的硬盘缓存策略,默认配置是InternalCacheDiskCacheFactory builder.setDiskCache(); //用于配置Glide读取缓存中图片的异步执行器, //默认配置是FifoPriorityThreadPoolExecutor,也就是先入先出原则 builder.setDiskCacheExecutor(); } //替换Glide组件 @Override public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) { } }
有关Generated API的使用这里再也不介绍,后期用到了再总结吧。
参考资料: