Glide是一个加载图片的库,他可以从多个源加载图片,如:网络,本地,Uri等,加载默认的Bitmap格式是RGB_565;
它在缓存处理方面有着很大的优势并且支持加载Gif动画以及本地Video;
Glide内部默认是通过HttpURLConnection网络方式加载图片的;
但是Glide要注意,这个库是要依赖于support liberary v4的。
- (一)配置
在我们的builde.gradle文件中配置库
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:19.1.0'
}
若加载不了库,可以从网上下载glide.jar ,拷贝到libs下,右击glide.jar,选择as library,添加到工程中。
- (二)使用
Glide.with(context).load("http://img2.3lian.com/2014/f6/173/d/51.jpg").into(imageView);
with()可接受三种参数:Context 、Activity、FragmentActivity,这也是Glide的亮点,它能根据传入参数Activity/Fragment的生命周期保持一致,去暂停和执行图片加载,这也节省了不必要的流量浪费。
1、加载图片方式
String参数加载
Glide.with(this).load("http://img2.3lian.com/2014/f6/173/d/51.jpg").into(imageView);
资源文件加载
Glide.with(context).load(R.mipmap.image).into(imageView);
本地文件加载
File file = new File(Environment.getExternalStorageDirectory() + File.separator + "image", "image.jpg");
Glide.with(this).load(file).into(imageView);
Uri加载
File file = new File(Environment.getExternalStorageDirectory() + File.separator + "image", "image.jpg");
Uri uri = Uri.fromFile(file);
Glide.with(this).load(uri).into(imageView);//uri加载方式
_ 2、加载Gif_
Glide.with(context).load("http://img1.3lian.com/2015/w4/17/d/64.gif").asGif().error(R.mipmap.error).placeholder(R.mipmap.place).into(imageView); //加载gif图片
Glide还提供了Gif相关操作的两个方法。
asBitmap() -- 显示Gif图片的第一帧;
asGif() -- 严格显示成Gif,那么当传入了一个非Gif 的url时,我们当做错误处理;
placeholder 占位符
placeholder设置给ImageView一个占位符,用于正在加载网络图片时显示的内容。
Glide.with(context).load("http://img2.3lian.com/2014/f6/173/d/55.jpg").placeholder(R.mipmap.place).into(imageView);
error
加载网络图片错误时,显示的内容,提示用户当前图片加载失败。
Glide.with(context).load("http://img2.3lian.com/2014/f6/173/d/55.jpg").error(R.mipmap.error).into(imageView);
Glide为我们提供了listener()方法,接收RequestListener对象。
//设置错误监听
RequestListener<String,GlideDrawable> errorListener=new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
Log.e("onException",e.toString()+" model:"+model+" isFirstResource: "+isFirstResource);
imageView.setImageResource(R.mipmap.ic_launcher);
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
Log.e("onResourceReady","isFromMemoryCache:"+isFromMemoryCache+" model:"+model+" isFirstResource: "+isFirstResource);
return false;
}
} ;
Glide.with(context).load("http://img2.3lian.com/2014/f6/173/d/55.jpg").listener(errorListener).into(imageView);
我们看到有两个回调方法,通过onException是图片加载异常回调,onResourceReady是加载成功的回调。我们可以测试不同情况打印的日志。
正确的url首次加载 isFromMemoryCache:false
正确的url第二次加载 isFromMemoryCache:true
错误url onException: java.io.IOException: Request failed 404: Not Found
无网络 onException: java.net.UnknownHostException
通过日志我们很容易看出异常的原因,因此,我们可以针对不同的操作情形,书写自己的处理给用户反馈。
*crossFade
实现占位符图片到加载图片平滑过渡效果,实际新api已经默认实现一个渐入渐出的动画效果,默认是300ms.
Glide.with(context).load("http://").error(R.mipmap.error).placeholder(R.mipmap.place).crossFade().into(imageView);
crossFade()还可以接收一个int型的参数,用它来指定动画执行的时间 crossFade(2000);
dontAnimate()
直接显示图片而没有任何淡入淡出效果
//Glide.with(context).load("http://").dontAnimate().into(imageView);
3、图片调整
Glide加载图片大小是自动调整的,他根据ImageView的尺寸自动调整加载的图片大小,并且缓存的时候也是按图片大小缓存,每种尺寸都会保留一份缓存,如果图片不会自动适配到 ImageView,调用 override(horizontalSize, verticalSize) 。这将在图片显示到 ImageView之前重新改变图片大小
//Glide.with(context).load("http://").dontAnimate().override(400,600).fitCenter().into(imageView);
注意override接收的参数是像素(px)
对于任何图像操作,调整大小可能让图片失真。但是我们要尽可能的避免发生这种情况发生。Glide 提供了两个图形装换的操作提供了两个标准选项:centerCrop 和 fitCenter
4、Glide网络加载方式
Glide内部默认是通过HttpURLConnection网络方式加载图片的,并且支持OkHttp,Volley
在gradle文件加入下面代码
//自动集成okhttp
compile 'com.github.bumptech.glide:okhttp-integration:1.4.0@aar'
compile 'com.squareup.okhttp:okhttp:2.2.0'
//自动集成volley
compile 'com.github.bumptech.glide:volley-integration:1.4.0@aar'
compile 'com.mcxiaoke.volley:library:1.0.19'
Gradle 会自动合并必要的 GlideModule 到Android.Manifest。Glide 会认可在 manifest 中的存在,然后使用 所集成的网络连接。
5、自定义动画
在前面我们已经提到过Glide提供了一个渐入渐出的动画效果,当然该动画不是那么酷炫,而且有时并不能达到我们想要的效果,不过Glide给我们提供了animate()方法,我们可以通过此方法实现我们自定义的动画效果。
本例实现了一个图片从小变大并且有一个旋转效果的动画。
资源文件方式
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="false"
android:duration="3000">
<scale
android:duration="@android:integer/config_longAnimTime"
android:fromXScale="0.1"
android:fromYScale="0.1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1"
android:toYScale="1"/>
<rotate
android:fromDegrees="0"
android:toDegrees="90"
android:pivotX="50%"
android:pivotY="50%"
/>
</set>
Glide.with(context).load("http:").animate(R.anim.anim).into(imageView);
java实现方式
//java文件设置动画
ViewPropertyAnimation.Animator animator=new ViewPropertyAnimation.Animator() {
@Override
public void animate(View view) {
view.setAlpha(0f);
ObjectAnimator fadeAnim = ObjectAnimator.ofFloat( view, "alpha", 0f, 1f );
fadeAnim.setDuration( 2500 );
fadeAnim.start();
}
};
Glide.with(context).load("http://img2.3lian.com/2014/f6/173/d/51.jpg").animate(animator).into(imageView);
6、Target
Glide不但可以把图片、视频剧照、GIF动画加载到View,还可以加载到自定义的Target实现中。
SimpleTarget
//SimpleTarget
SimpleTarget target = new SimpleTarget<Drawable>(){
@Override
public void onResourceReady(Drawable resource, GlideAnimation<? super Drawable> glideAnimation) {
textView.setBackground(resource);
}
};
Glide.with(context)
.load("http://img2.3lian.com/2014/f6/173/d/51.jpg")
.animate(animator)
.into(target);
上面的代码我们将TextView作为Target,将加载的图片设为背景,对于SimpleTarget是接收的泛型数据,如果我们需要Bitmap对象,我们将泛型为Bitmap.以及其它我们想要的类型。 我们还可以指定加载的宽和高,如下,设置宽和高都是100,单位是px
SimpleTarget target = new SimpleTarget<Drawable>(100,100){
@Override
public void onResourceReady(Drawable resource, GlideAnimation<? super Drawable> glideAnimation) {
textView.setBackground(resource);
}
};
ViewTarget
如果你想加载一个图片到View中,但是你想观察或者覆盖Glide的默认行为。你可以覆盖ViewTarget或者它的子类。 当你想让Glide来获取view的的大小,但是由自己来启动动画和设置资源到view中,ViewTarget是个不错的选择。如果你要加载一个图片到ImageView之外的自定义view中,那么ImageViewTarget或者它的子类就不能满足你的要求,此时继承ViewTarget就特别合适。 你可以静态的定义一个ViewTarget的子类,或者传递一个匿名内部类到你的加载调用里:
Glide.with(yourFragment)
.load(yourUrl)
.into(new ViewTarget<YourViewClass, GlideDrawable>(yourViewObject) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation anim) {
YourViewClass myView = this.view;
// Set your resource on myView and/or start your animation here.
}
});