Android图片加载框架Glide使用总结

时间:2023-01-29 09:20:45
1.使用Glide结合列表的样式进行图片加载:  (1)如果使用的是ListView,可以直接在Adapter的getView方法中使用:              public View getView(int position, View convertView, ViewGroup parent) {
if (null == convertView) {
// .....
}
Glide.with(context).load(imageUrls[position]).into(holder.imageView);
return convertView;
      }

(2)如果使用的是RecyclerView,可以在Adapter的onBindViewHolder方法中使用:    public void onBindViewHolder(RVViewHolder holder, int position) {
        
        Glide.with(MainActivity.this)
                .load(args[position])
                .into(holder.imageView);
    }

(3) 当加载网络图片时,由于加载过程中图片未能及时显示,此时可能需要设置等待时的图片,通过placeHolder()方法:Glide.with(context).load(UsageExampleListViewAdapter.eatFoodyImages[0])
.placeholder(R.mipmap.ic_launcher) // can also be a drawable
.into(imageViewPlaceholder);

(4) 当加载图片失败时,通过error(Drawable drawable)方法设置加载失败后的图片显示:Glide.with(context).load("http://futurestud.io/non_existing_image.png")
.error(R.mipmap.future_studio_launcher)
.into(imageViewError);

(5) 图片的缩放,centerCrop()和fitCenter():// 使用centerCrop是利用图片图填充ImageView设置的大小,如果ImageView的 Height是match_parent则图片就会被拉伸填充
Glide.with(MainActivity.this).load(args[position]).centerCrop()
.into(holder.imageView);

// 使用fitCenter即缩放图像让图像都测量出来等于或小于 ImageView 的边界范围该图像将会完全显示,但可能不会填满整个 ImageView。
Glide.with(MainActivity.this).load(args[position]).fitCenter()
.into(holder.imageView);

(6)显示gif动画:Glide.with(context).load(gifUrl).asGif() // 判断加载的url资源是否为gif格式的资源
.error(R.drawable.full_cake).into(imageViewGif);

(7)显示本地视:String filePath = "/storage/emulated/0/Pictures/example_video.mp4";
Glide.with(context).load(Uri.fromFile(new File(filePath)))
.into(imageViewGifAsBitmap);

(8)缓存策略:Glide  
   .with( context )
   .load( Images[0] )
   .skipMemoryCache( true ) //跳过内存缓存
   .into( imageViewInternet );

Glide.with(context).load(images[0])
.diskCacheStrategy(DiskCacheStrategy.NONE) // 跳过硬盘缓存
.into(imageViewInternet);

  • DiskCacheStrategy.NONE 什么都不缓存
  • DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像
  • DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即降低分辨率后的(或者是转换后的)
  • DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为
 (9) 优先级,设置图片加载的顺序:
    
  • Priority.LOW
  • Priority.NORMAL
  • Priority.HIGH
  • Priority.IMMEDIATE  
private void loadImageWithHighPriority() {
Glide.with(context).load(mages[0]).priority(Priority.HIGH)
.into(imageViewHero);
}


private void loadImagesWithLowPriority() {
Glide.with(context).load(images[1]).priority(Priority.LOW)
.into(imageViewLowPrioLeft);
Glide.with(context).load(images[2]).priority(Priority.LOW)
.into(imageViewLowPrioRight);
}

 (10) 当不需要将加载的资源直接放入到ImageView中而是想获取资源的Bitmap对象://括号中的300,600代表宽和高但是未有作用
SimpleTarget target = new SimpleTarget<Bitmap>(300,600) {
               @Override
               public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap>glideAnimation) {
                   holder.imageView.setImageBitmap(resource);
               }
           };
           Glide.with(MainActivity.this)
                   .load(args[position])
                   .asBitmap()
                   .into(target);
         (11)集成网络栈(okHttp,Volley):  dependencies {  
   // your other dependencies
   // ...
   // Glide
   compile 'com.github.bumptech.glide:glide:3.6.1'
   // Glide's OkHttp Integration 
   compile 'com.github.bumptech.glide:okhttp-integration:1.3.1@aar'
   compile 'com.squareup.okhttp:okhttp:2.5.0'
}

dependencies {  
   // your other dependencies
   // ...
   // Glide
   compile 'com.github.bumptech.glide:glide:3.6.1'
   // Glide's Volley Integration 
   compile 'com.github.bumptech.glide:volley-integration:1.3.1@aar'
   compile 'com.mcxiaoke.volley:library:1.0.8'
}

(12)规范使用:

Glide使用起来很简单,而且不需要任何特别的配置就自动包含了bitmap pooling 。

DrawableRequestBuilder requestBuilder = Glide.with(context).load(imageUrl);
requestBuilder.into(imageView);

这就是加载一张图片的全部要求。就像安卓中的很多地方一样,with() 方法中的context到底是哪种类型是不清楚的。有一点很重要需要记住,就是传入的context类型影响到Glide加载图片的优化程度,Glide可以监视activity的生命周期,在activity销毁的时候自动取消等待中的请求。但是如果你使用Application context,你就失去了这种优化效果。

Glide.with(context)
    .load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
    .into(ivImg);
(13)优化特性

类似的是,如果相关的item已经滚出了屏幕的范围,Glide会自动取消列表中的悬着的图片请求 。因为绝大多数开发者都会在adapter中利用view的回收,Glide做到这点是通过在ImageView上设置一个tag,在加载另外一张图片之前检查这个tag,如果存在就取消第一次请求。

Glide提供了几个让你感觉图片加载速度变快的特性。第一个就是在图片显示在屏幕上之前就预先取出图片。它提供了一个ListPreloader类, 它被应该事先取出的item数目实例化。然后通过setOnScrollListener(OnScrollListener).被传递给ListView。你想在ListView之外也能预先取出图片吗?没问题,使用前面的builder对象就可以了,只需调用builder.downloadOnly()。

downloadOnly见:https://github.com/bumptech/glide/wiki/Loading-and-Caching-on-Background-Threads 。