Glide的简单介绍

在Android Studio 加入依赖包:

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

}

简单加载图片:

[java]  view plain  copy
  1. Glide  
  2.  <strong><span style="color:#ff0000;">  .with(context)</span></strong>  
  3.    .load(url)  
  4.    .centerCrop()  
  5.    .placeholder(R.drawable.xxx)  
  6.    .crossFade()  
  7.    .into(myImageView);  

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


如果要使用 Glide 加载中的 Bitmap 可以使用BitmapImageViewTarget 。

[java]  view plain  copy
  1. Glide.with(Application.getInstance())  
  2.                .load(imgurl)  
  3.                .asBitmap()  
  4.                .placeholder(R.drawable.image_offer_default)  
  5.                .into(new BitmapImageViewTarget(ImageView) {  
  6.                    @Override  
  7.                    protected void setResource(final Bitmap resource) {  
  8.                          
  9.                    }  
  10.                });  


使用Glide 显示圆形图片

[java]  view plain  copy
  1. <span style="font-size:14px;">  Glide.with(context).load(url).asBitmap().centerCrop().into(new BitmapImageViewTarget(imageView) {  
  2.             @Override  
  3.             protected void setResource(Bitmap resource) {  
  4.                 RoundedBitmapDrawable circularBitmapDrawable =  
  5.                         RoundedBitmapDrawableFactory.create(context.getResources(), resource);  
  6.                 circularBitmapDrawable.setCircular(true);  
  7.                 imageView.setImageDrawable(circularBitmapDrawable);  
  8.             }  
  9.         });</span>  



加载显示Gif 动态图

[java]  view plain  copy
  1. Glide.with(this).load(url).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView);  


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

[java]  view plain  copy
  1. Glide.with(this).load("url").diskCacheStrategy(DiskCacheStrategy.SOURCE).into(new GlideDrawableImageViewTarget(iv, 1));  


GlideDrawableImageViewTarget  控制了显示次数。


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

方案一: 不设置占位;
方案二:使用Glide的Transformation API自定义圆形Bitmap的转换。这里是一个已有的例子
方案三:使用下面的代码加载图片:

[java]  view plain  copy
  1. Glide.with(mContext)  
  2.     .load(url)   
  3.     .placeholder(R.drawable.loading_spinner)  
  4.     .into(new SimpleTarget<Bitmap>(width, height) {  
  5.         @Override   
  6.         public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {  
  7.             // setImageBitmap(bitmap) on CircleImageView   
  8.         }   
  9.     });  
该方法在listview上复用有问题的bug,如果在listview中加载CircleImageView,请不要使用该方法。
方案四:不使用Glide的默认动画:

[java]  view plain  copy
  1. Glide.with(mContext)  
  2.     .load(url)   
  3.     .dontAnimate()  
  4.     .placeholder(R.drawable.loading_spinner)  
  5.     .into(circleImageview);  


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

不要再非主线程里面使用Glide加载图片,如果真的使用了,请把context参数换成getApplicationContext。更多的细节请参考这个issue

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

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

[java]  view plain  copy
  1. Glide.with(context).load(urls.get(i).getUrl()).fitCenter().into(imageViewHolder.image);  
  2.         imageViewHolder.image.setTag(R.id.image_tag, i);  
  3.         imageViewHolder.image.setOnClickListener(new View.OnClickListener() {  
  4.             @Override  
  5.                 int position = (int) v.getTag(R.id.image_tag);  
  6.                 Toast.makeText(context, urls.get(position).getWho(), Toast.LENGTH_SHORT).show();  
  7.             }  
  8.         });  

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

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

方案二:从Glide的3.6.0之后,新添加了全局设置的方法。具体方法如下:
先实现GlideMoudle接口,全局设置ViewTaget的tagId:

[java]  view plain  copy
  1. public class MyGlideMoudle implements GlideModule{  
  2.     @Override  
  3.     public void applyOptions(Context context, GlideBuilder builder) {  
  4.         ViewTarget.setTagId(R.id.glide_tag_id);  
  5.     }  
  6.   
  7.     @Override  
  8.     public void registerComponents(Context context, Glide glide) {  
  9.   
  10.     }  
  11. }  
同样,也需要在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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值