图片加载之Glide

1. 概述

2. 用法

首先要引入类库
compile 'com.github.bumptech.glide:glide:3.7.0'

2.1 基本用法

加载图片很方便

        /**
         *  Glide 默认采用HttpURLConnection ,并且支持OkHttp,Volley
         */
        Glide.with(this)
                .load(url)
                .placeholder(R.mipmap.ic_launcher)
                .crossFade()
                .centerCrop()
                .animate(R.anim.anim)
                .listener(new RequestListener() {
                    @Override
                    public boolean onException(Exception e, String model, Target target, boolean isFirstResource) {
                        return false;
                    }
                    @Override
                    public boolean onResourceReady(GlideDrawable resource, String model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {
                        return false;
                    }
                })
                .into(imageview);
    }
}

2.2 几种加载方式 ,可以加载多种数据源:url、uri、本地文件、资源文件等

DrawableTypeRequest load(String string)
DrawableTypeRequest load(Uri uri)
DrawableTypeRequest load(File file)
DrawableTypeRequest load(Integer resourceId)
DrawableTypeRequest load(URL url)

2.3 监听

Glide可以设置监听,图片加载是否成功。失败可以看到相应错误日志

new RequestListener() {
                    @Override
                    public boolean onException(Exception e, String model, Target target, boolean isFirstResource) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(GlideDrawable resource, String model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {
                        return false;
                    }
                }

2.4 设置图片大小

2.5 加载GIF

在加载gif 格式图片时,需要设置缓存策略,要不会非常慢

2.6 Glide网络加载方式

Glide内部默认是通过HttpURLConnection网络方式加载图片的,并且支持OkHttp,Volley

集成OkHttp 集成okhttp 2.x 和 okhttp 3.x代码不一样

okhttp 2.x 在gradle文件加入下面代码

//自动集成okhttp 
compile 'com.github.bumptech.glide:okhttp-integration:1.4.0@aar'
compile 'com.squareup.okhttp:okhttp:2.2.0'

然后在 AndroidManifest.xml 文件添加

 

okhttp 3.x 在gradle文件加入下面代码

 compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'
 compile 'com.squareup.okhttp3:okhttp:3.5.0'

然后在 AndroidManifest.xml 文件添加

 

Gradle 会自动合并必要的 GlideModule到你的 Android.Manifest。Glide 会认可在 manifest 中的存在,然后使用 OkHttp 做到所有的网络连接。

集成Volley
//自动集成volley 
compile 'com.github.bumptech.glide:volley-integration:1.4.0@aar' 
compile 'com.mcxiaoke.volley:library:1.0.19'

然后在 AndroidManifest.xml 文件添加


这将添加 Volley 并集成该库到你的项目中。集成库添加到 GlideModule
到你的Android.Manifest。Glide 会自动认出它,然后使用 Volley 作为网络库。并不要求做其他的配置!
警告::如果你把这两个库都在你的 build.gradle中声明了,那这两个库都会被添加。因为 Glide 没有任何特殊的加载顺序,你将会有一个不稳定的状态,它并不明确使用哪个网络库,所以确保你只添加了一个集成库。

其他网络库

如果你是别的网络库的粉丝,你是不幸的。Glide 除了 Volley 和 OkHttp 外不会自动配置其他的库。然而你随时可以整合你喜欢的网络库,在 GitHub 上去开一个 pull request。为Volley 和 OkHttp 可能给你一个方向。

2.7 自定义动画

在前面我们已经提到过Glide提供了一个渐入渐出的动画效果,当然该动画不是那么酷炫,而且有时并不能达到我们想要的效果,不过Glide给我们提供了animate()方法,我们可以通过此方法实现我们自定义的动画效果。
animate(int animationId)




    
    

2.8 Target

当我们只需要一个bitmap时,可以使用这个办法 。

Glide.with(this)
                .load(url)
                .placeholder(R.mipmap.ic_launcher)
                .crossFade()
                .centerCrop()
                .animate(R.anim.anim)
                .listener(new RequestListener() {
                    @Override
                    public boolean onException(Exception e, String model, Target target, boolean isFirstResource) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(GlideDrawable resource, String model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {
                        return false;
                    }
                })
                .into(target);
//                .into(imageview);

    }
    private SimpleTarget target = new SimpleTarget() {
        @Override
        public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
            // do something with the bitmap
            // for demonstration purposes, let's just set it to an ImageView
            imageview.setImageBitmap( bitmap );
        }
    };

2.9 自定义转换 transform

可以实现图片的一些特效,如圆角、高斯模糊、旋转等。
为了实践自定义转换,你将需要创建一个新类,它实现了 Transformation 接口。要实现这个方法还是比较复杂的,你必须要有对 Glide 内部架构方面的洞察力才能做的比较棒。如果你只是想要对图片(不是 Gif 和 video)做常规的 bitmap 转换,我们推荐你使用抽象类 BitmapTransformation。它简化了很多的实现,这应该能覆盖 95% 的应用场景啦。

/**
 * Created by dell on 2016/9/20.
 */
public class BlurTransformation extends BitmapTransformation {

    public BlurTransformation(Context context) {
        super( context );
    }
    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return null; // todo
    }

    @Override
    public String getId() {
        return null; // todo
    }
}

定义完成之后,在加载图片时设置如下:

Glide
       .with( context )
       .load( eatFoodyImages[0] )
       .transform( new BlurTransformation( context ) )
       //.bitmapTransform( new BlurTransformation( context ) ) // this would work too!
      .into( imageView1 );

Github上有个开源项目 ,glide-transformations,它为 Glide 转换提供了多种多样的实现。非常值得去看一下,说不定你的想法已经在它那里实现了。

2.10 自定义GlideModule

Glide 一些配置都在这里设置,设置图片质量、缓存大小及目录等


/**
 * Created by xiehui on 2016/8/29.
 */
public class ConfigurationGlide implements GlideModule {
    @Override
    public void applyOptions(final Context context, GlideBuilder builder) {
        //配置 , 默认是ARGB8888(每像素4字节存储) 和 RGB565(每像素2字节存储)
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);




        //磁盘缓存默认是250M,路径名image_manager_disk_cache如下
        builder.setDiskCache(new InternalCacheDiskCacheFactory(context, 1024 * 1024 * 100));//内部磁盘缓存
        builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, 100 * 1024 * 1024));//磁盘缓存到外部存储

        //指定缓存目录1
        String downLoadPath = Environment.getDownloadCacheDirectory().getPath();
        builder.setDiskCache(new DiskLruCacheFactory(downLoadPath, 1024 * 1024 * 100));

        //指定缓存目录2
        builder.setDiskCache(new DiskCache.Factory() {
            @Override
            public DiskCache build() {
                File cacheLocation = new File(context.getExternalCacheDir(), "cache_dir");
                cacheLocation.mkdirs();
                return DiskLruCacheWrapper.get(cacheLocation, 1024 * 1024 * 100);
            }
        });
    }

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

在manifest文件中添加配置


2.11

参考文档

1、详谈高大上的图片加载框架Glide -应用篇
2、详谈高大上的图片加载框架Glide -源码篇
3、Glide - 开始 ! :对Gldie有全面介绍,基本用法及高级用法
4、Glide Github主页

你可能感兴趣的:(图片加载之Glide)