android Glide简单使用
Glide的基本使用
导入库
compile ‘com.github.bumptech.glide:glide:3.7.0’
添加代码混淆(可加可不加)
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
Glide使用详解
加载网络图片
Glide.with(context).load(internetUrl).into(targetImageView);
从文件加载图片
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"Test.jpg");
Glide.with(context).load(file).into(imageViewFile);
从资源id加载图片
int resourceId = R.mipmap.ic_launcher;
Glide.with(context).load(resourceId).into(imageViewResource);
从uri加载图片
Glide.with(context).load(uri).into(imageViewUri);
加载Gif图片
String gifUrl = "xxxxx";
Glide.with( context ).load( gifUrl ).into( imageViewGif );
设置默认占位图.placeholder()
设置加载失败的图片.error()
Glide.with( context ).load( gifUrl ).placeholder( R.drawable.cupcake ).error( R.drawable.full_cake ).into( imageViewGif );
.fallback()
除了上面两种‘异常情况’,还有一种情形就是打开手机的通讯录的时候,可以看到你给有些喜欢的人设置了照片,然而有些可怜的人并没给有,总不能在那里留下一片空白吧,这个时候相当于传递了Null,传递null时,这个callback方法就会被调用。
Glide.with(context)
.load( null)//加载空指针的时候
.fallback( R.drawable.wuyanzu)
.into( imageViewNoFade );
设置加载动画
其实这个是默认的,但是你还是可以写出来,渐显动画
1、.crossFade() :Glide提供淡如淡出
Glide.with(context).load().placeholder(R.mipmap.ic_launcher) .error(R.mipmap.future_studio_launcher).crossFade().into(imageViewFade);
这里还有一个.fadeFade(int duration),设置动画时间。如果你不想要动画可以加上.dontAnimate()
2、.animate(android.R.anim.slide_in_left):Android系统提供,从左到右滑出加载动画
调整图片大小.resize(int ,int )
单位是像素,裁剪你的图片大小。其实Glide已经会自动根据你ImageView裁剪照片来放在缓存中了。但是不想适应ImageView大小的时候,可以调用这个方法.override()为ImageView指定大小。
Glide.with(context).load(image).override(600, 200) .into(imageViewResize);
裁剪图片**.fitCenter()和.CenterCrop()
Glide清楚在合适的ImageView中加载合适的Image**.当需要裁剪大小时,有个.centerCrop方法,这个方法的裁剪会让你的ImageView周围不会留白,还有一个.fitCenter()方法,表示让你的Image完全显示,尺寸不对时,周围会留白。
设置缩略图.thumbnail()
.thumbnail()方法的目的就是让用户先看到一个低解析度的图,点开后,再加载一个高解析度的图。
//表示为原图的十分之一
Glide.with( context ).load(image).thumbnail( 0.1f ).into( imageView2 );
一种更高级的缩略图加载方式:
当缩略图也需要通过网络加载全部解析度的时候。
private void loadImageThumbnailRequest() {
DrawableRequestBuilder<String> thumbnailRequest = Glide.with( context ).load( eatFoodyImages[2] );
Glide.with( context ).load( UsageExampleGifAndVideos.gifUrl ).thumbnail( thumbnailRequest ).into( imageView3 );
}
设置图片显示效果(圆角、圆形、高斯模糊、蒙板、裁剪等等).bitmapTransform()
Glide.with(this).load(R.mipmap.ic_image_sample)
//模糊
.bitmapTransform(new BlurTransformation(this))
//圆角
.bitmapTransform(new RoundedCornersTransformation(this, 24, 0, RoundedCornersTransformation.CornerType.ALL))
//遮盖
.bitmapTransform(new MaskTransformation(this, R.mipmap.ic_launcher))
//灰度
.bitmapTransform(new GrayscaleTransformation(this))
//圆形
.bitmapTransform(new CropCircleTransformation(this))
.into(mResultIv);
Glide的缓存
用过手机的都知道,当划上划下一个ListView的时候,第二次都比第一次快,就是因为为GlideView对资源进行了缓存,而且封装的很好,甚至不需要自己去设定缓存大小,Glide会智能地自己给我们根据设备设置缓存大小。
缓存是为了减少或者杜绝多的网络请求。为了避免缓存,Glide用了内存缓存和‘外存缓存机制’,并且 提供了相应的方法,完全封装,不需要处理细节。Glide会自动缓存到内存,除非调用.skipMemoryCache( true )。尽管调用了这个,Glide还是会缓存到外存,还有一种情形,就是有一张图片,但是这张图变化非常快,这个时候可能并不想缓存到外存中,就使用.diskCacheStrategy( DiskCacheStrategy.NONE )。如果你两种都不需要,可以两个方法组合着一起使用。
自定义外存缓存机制
Glide默认会缓存Image的很多个版本,比如原图,如果你的imageView大小的缓存。.diskCacheStrategy()有以下几种缓存策略:
DiskCacheStrategy.NONE 什么都不缓存
DiskCacheStrategy.SOURCE 只缓存最高解析图的image
DiskCacheStrategy.RESULT 缓存最后一次那个image,比如有可能你对image做了转化
DiskCacheStrategy.ALL image的所有版本都会缓存
Glide.with( context ).load( image ).diskCacheStrategy( DiskCacheStrategy.SOURCE ).into( imageViewFile );
注意事项
1、前面我们已经学习到asGif()可以加载gif图,asBitmap()可以加载静态gif图即gif图的第一帧,如果非gif图用asGif()方法加载呢?这时候会报错。。Glide默认可以自动识别图片格式,加载gif图,所以在不确定图片格式的情况下,不要直接写asGif哦。
2、You cannot start a load for a destroyed activity这样的异常如何处理?
记住不要再非主线程里面使用Glide加载图片,如果真的使用了,请把context参数换成getApplicationContext。希望可以帮你避免这个问题。
3、为什么有的图片第一次加载的时候只显示占位图,第二次才显示正常的图片呢?
.如果你刚好使用了这个圆形Imageview库或者其他的一些自定义的圆形Imageview,而你又刚好设置了占位的话,那么,你就会遇到第一个问题。如何解决呢?
方案一: 不设置占位;
方案二:使用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
}
};
图片大小拉伸问题
有时候你会发现网络加载完了之后会有拉伸现象,而你的控件大小明明是自适应的呀,这是为什么呢,请你检查下你是否设置了占位图,有的话请去掉就ok了。
简单总结一下,我这里讲了Glide比较全面的用法,有如何加载图片,Glide的缓冲设置,Glide设置圆角,Glide设置图片的background,Glide加载GIF图片等,大家使用的话一般了解加载图片和圆角图片就可以了。这里在列举一下。
//圆形裁剪
Glide.with(this)
.load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")
.bitmapTransform(new CropCircleTransformation(this))
.into(iv_0);
//圆角处理
Glide.with(this)
.load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")
.bitmapTransform(new RoundedCornersTransformation(this,30,0, RoundedCornersTransformation.CornerType.ALL))
.into(iv_0);