图片加载框架--Glide用法
图片加载框架--Glide用法
蜗牛崛起 发表于1年前
图片加载框架--Glide用法
  • 发表于 1年前
  • 阅读 20
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

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.
        }
    });
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 3
博文 120
码字总数 63547
×
蜗牛崛起
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: