c语言编程笔录

首页 >   > 笔记大全

笔记大全

利用Glide如何实现一个加载进度条功能

更新时间:2023-10-19

第一段:Glide加载图片的基本用法

Glide是一种Android平台上的图片加载框架,可以加载本地资源、视频画面和网络图片等多种格式的图片。 要使用Glide,您需要向Android Studio项目的build.gradle文件中添加以下代码:

dependencies {
   // ...其他依赖项
   implementation 'com.github.bumptech.glide:glide:4.12.0'
   annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
}

Glide的基本用法非常简单。只需要调用with()方法并传递一个Context,然后使用load()方法传递一个URL或本地资源的文件路径即可加载图片:

Glide.with(this)
        .load("http://www.example.com/image.jpg")
        .into(imageView);

要在应用程序中加载本地图片,只需提供本地文件路径即可:

Glide.with(this)
        .load(R.drawable.image)
        .into(imageView);

第二段:如何加入加载进度条功能

要实现加载进度条功能,可以创建一个自定义SeekBar并在图片加载时更新它的进度。SeekBar可以使用以下XML代码创建:


为了更新SeekBar,我们需要在Glide加载图片时创建一个RequestListener。RequestListener的一个好处是它允许您在图片加载成功或失败时执行某些代码。以下代码片段演示了如何实现一个RequestListener,其中更新SeekBar的代码位于onResourceReady()方法中:

.Glide.with(this)
        .load("http://www.example.com/image.jpg")
        .listener(new RequestListener() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
                // 加载失败
                return false;
            }

            @Override
            public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
                // 加载成功
                progressBar.setVisibility(View.INVISIBLE)
                return false;
            }
        })
        .into(imageView);

第三段:如何在Glide中使用ProgressListener

另一种实现加载进度条的方法是使用ProgressListener。在Glide 4.x版本中,您可以使用一个库来实现这一点:com.github.bumptech.glide:okhttp3-integration:4.12.0。该库允许使用OkHttp3的拦截器来捕获图片加载进度。

例如,要使用ProgressListener,您可以添加这个库的依赖项,并创建一个新的Glide模块,如下所示:

GlideApp.with(this)
  .load("http://www.example.com/image.jpg")
  .listener(new RequestListener() {
    @Override
    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
      return false;
    }

    @Override
    public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
      return false;
    }
  })
  .apply(
    new RequestOptions()
      .signature(yourSignature)
      .listener(new ProgressListener() {
        @Override
        public void onProgress(long bytesRead, long expectedLength) {
          // 更新SeekBar的进度
          int percent = (int) (100 * bytesRead / expectedLength);
          seekBar.setProgress(percent);
        }
      })
  )
  .into(imageView);

第四段:如何在Glide中实现进度下载功能

另一种实现进度条的方法是在Glide中添加进度下载功能。这可以通过添加OkHttp拦截器来实现。其中一个拦截器是OkHttpInterceptors.ProgressInterceptor,可以捕获进度并通知您更新UI。

示例代码如下:

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.addInterceptor(new ProgressInterceptor());
OkHttpClient okHttpClient = builder.build();

Glide.with(context)
  .load("http://www.example.com/image.jpg")
  .apply(new RequestOptions().dontAnimate().diskCacheStrategy(DiskCacheStrategy.ALL).signature(new ObjectKey(model.getImageUrl())))
  .listener(new RequestListener() {
    @Override
    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
      return false;
    }

    @Override
    public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
      return false;
    }
  })
  .apply(
    new RequestOptions()
      .signature(new ObjectKey(model.getImageUrl()))
      .diskCacheStrategy(DiskCacheStrategy.ALL)
      .listener(new ProgressListener() {
        @Override public void onProgress(long bytesRead, long totalBytes) {
          // 更新SeekBar的进度
          int percent = (int) ((bytesRead * 1f / totalBytes) * 100);
          seekBar.setProgress(percent);
        }
      })
  )
  .into(imageView);

无论采用何种方法,添加一个加载进度条会让您的应用看起来更加专业。使用Glide中的RequestListener或ProgressListener,您可以在应用程序中轻松实现这一功能。