Glide 使用详解

  • Post author:
  • Post category:其他



今天简单把Glide 使用的各种场景总结一下,加载中可能出现的问题,加载显示圆形图片以及加载Gif 图片 。





Glide GitHub 源码地址:


https://github.com/bumptech/glide


在Android Studio 加入依赖包:

dependencies {
  compile 'com.github.bumptech.glide:glide:3.7.0'
  compile 'com.android.support:support-v4:19.1.0'
}



简单加载图片:

 Glide
  <strong><span style="color:#ff0000;">  .with(context)</span></strong>
    .load(url)
    .centerCrop()
    .placeholder(R.drawable.xxx)
    .crossFade()
    .into(myImageView);


context 可以是activity,也可以是  Application 的context ,个人推荐最好使用 Application 的 context ,以前项目组使用 activity ,和 recyclerview 结合使用的时候出现过 下拉显示异常问题。就是加载了20张 Item 图片,然后 滑倒底部再上滑的时候 上面显示过的图片就不显示了。没有找到造成的具体原因,改成Application的context


就没有这种现象了。





如果要



使用 Glide 加载中的 Bitmap



可以使用BitmapImageViewTarget 。

 Glide.with(Application.getInstance())
                .load(imgurl)
                .asBitmap()
                .placeholder(R.drawable.image_offer_default)
                .into(new BitmapImageViewTarget(ImageView) {
                    @Override
                    protected void setResource(final Bitmap resource) {
                        
                    }
                });






使用Glide 显示圆形图片


<span style="font-size:14px;">  Glide.with(context).load(url).asBitmap().centerCrop().into(new BitmapImageViewTarget(imageView) {
            @Override
            protected void setResource(Bitmap resource) {
                RoundedBitmapDrawable circularBitmapDrawable =
                        RoundedBitmapDrawableFactory.create(context.getResources(), resource);
                circularBitmapDrawable.setCircular(true);
                imageView.setImageDrawable(circularBitmapDrawable);
            }
        });</span>



加载显示Gif 动态图

Glide.with(this).load(url).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView);


如果要控制Gif 显示次数,可以使用:

Glide.with(this).load("url").diskCacheStrategy(DiskCacheStrategy.SOURCE).into(new GlideDrawableImageViewTarget(iv, 1));

GlideDrawableImageViewTarget  控制了显示次数。





有时候图片第一次加载的时候只显示占位图,第二次才显示正常的图片解决办法:







方案一: 不设置占位;




方案二:使用Glide的Transformation API自定义圆形Bitmap的转换。这里是一个已有的


例子







方案三:使用下面的代码加载图片:






Glide.with(mContext)
    .load(url) 
    .placeholder(R.drawable.loading_spinner)
    .into(new SimpleTarget<Bitmap>(width, height) {
        @Override 
        public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
            // setImageBitmap(bitmap) on CircleImageView 
        } 
    });



该方法在listview上复用有问题的bug,如果在listview中加载CircleImageView,请不要使用该方法。




方案四:不使用Glide的默认动画:




Glide.with(mContext)
    .load(url) 
    .dontAnimate()
    .placeholder(R.drawable.loading_spinner)
    .into(circleImageview);







出现类似You cannot start a load for a destroyed activity这样的异常呢?





不要再非主线程里面使用Glide加载图片,如果真的使用了,请把context参数换成getApplicationContext。

更多的细节请参考


这个issue













不能给加载的图片setTag() ???













方案一:使用setTag(int,object)方法设置tag,具体用法如下:




















Glide.with(context).load(urls.get(i).getUrl()).fitCenter().into(imageViewHolder.image);
        imageViewHolder.image.setTag(R.id.image_tag, i);
        imageViewHolder.image.setOnClickListener(new View.OnClickListener() {
            @Override
                int position = (int) v.getTag(R.id.image_tag);
                Toast.makeText(context, urls.get(position).getWho(), Toast.LENGTH_SHORT).show();
            }
        });



同时在values文件夹下新建ids.xml,添加



<item name=”image_tag” type=”id”/>





方案二:从Glide的3.6.0之后,新添加了全局设置的方法。具体方法如下:




先实现GlideMoudle接口,全局设置ViewTaget的tagId:






public class MyGlideMoudle implements GlideModule{
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        ViewTarget.setTagId(R.id.glide_tag_id);
    }

    @Override
    public void registerComponents(Context context, Glide glide) {

    }
}



同样,也需要在ids.xml下添加id




<item name=”glide_tag_id” type=”id”/>





最后在 Manifest 中添加





<meta-data

android:name=”com.yourpackagename.MyGlideMoudle”

android:value=”GlideModule” />







一些使用技巧




1.Glide.with(context).resumeRequests()和 Glide.with(context).pauseRequests()



当列表在滑动的时候,调用pauseRequests()取消请求,滑动停止时,调用resumeRequests()恢复请求。这样是不是会好些呢?


2.Glide.clear()



当你想清除掉所有的图片加载请求时,这个方法可以帮助到你。


3.ListPreloader



如果你想让列表预加载的话,不妨试一下ListPreloader这个类。








加入了缓存策略,缓存策略有四种如下:







/** Caches with both {@link #SOURCE} and {@link #RESULT}. */

ALL(true, true),

/** Saves no data to cache. */

NONE(false, false),

/** Saves just the original data to cache. */

SOURCE(true, false),

/** Saves the media item after all transformations to cache. */

RESULT(false, true);

ALL和RESULT的缓存策略不可以,NONE是不缓存数据,SOURCE是缓存原型,原图。加上了如上的缓存策略就解决了很慢或者有时加载不出gif图的问题了。


















其他优秀的加载图片库还有










Universal Image Loader:








https://github.com/nostra13/Android-Universal-Image-Loader










Picasso


: Square出品












https://github.com/square/picasso












Fresco


:Facebook












http://www.fresco-cn.org/




















版权声明:本文为jia635原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。