[转]Glide的使用详解

注:本文内容主要参考了郭霖的专栏 Glide最全解析总结而成。

Glide做为一个快速高效的图片加载库,在平常的Android开发中常常会用到,下面咱们来详细介绍一下它的用法。html

1 Glide的简单使用

配置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);

2 添加RequestOptions

经过RequestOptions,咱们能够在借助Glide加载图片时优化一下用户体验:app

  1. 添加占位图:在展现图片加载出来以前先显示一张临时的图片;
  2. 指定图片宽高;
  3. 指定缓存机制;
  4. 进行图片变换:圆角化、圆形化、模糊化等等。

具体实现以下:框架

//添加占位图
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种类型参数:异步

  1. DiskCacheStrategy.NONE:表示不缓存任何内容
  2. DiskCacheStrategy.DATA:表示只缓存原始图片
  3. DiskCacheStrategy.RESOURCE:表示只缓存转换事后的图片
  4. DiskCacheStrategy.ALL :表示既缓存原始图片,也缓存转换事后的图片
  5. 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);
    }
}

3 在失败时开始新的请求

借助error方法实现请求失败时开始新的请求,须要给error方法传入一个RequestBuilder对象或本地资源(Drawable或resourceId):

Glide.with(MainActivity.this).load(primaryUrl).error(Glide.with(MainActivity.this)
      .load(fallbackUrl)).into(imageView);

4 指定加载格式

无论咱们传入的是一张普通图片,仍是一张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);

5 into方法

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更多的用法详见: 目标

6 预加载

需求:对图片进行预加载,等真正要显示时直接从缓存中读取

//以原尺寸预加载
Glide.with(MainActivity.this).load(URL).preload();
//或者以指定尺寸预加载
Glide.with(MainActivity.this).load(URL).preload(200,300);
//在须要加载时再从缓存中读取便可
Glide.with(MainActivity.this).load(URL).preload();

7 访问缓存文件

咱们借助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

8 监听

能够借助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方法了。

9 更改Glide配置-自定义模块

建立一个类使其继承自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的使用这里再也不介绍,后期用到了再总结吧。

参考资料:

  1. Android图片加载框架最全解析(八),带你全面了解Glide 4的用法
  2. 关于Glide
相关文章
相关标签/搜索