android Glide图片框架最全使用说明

概述:

    本文的所有内容几乎全部来自郭神的Glide解析系列博客,郭神的水平是我非常敬佩的,在浏览完该系列博客之后,有了想把Glide用法汇总起来方便查阅的想法。原系列博客包括很多源码解析,篇幅比较长,我这里只总结使用方法,想深入了解原理的请阅读郭神的博客。郭神的解析是针对Glide3.7的版本,该版本已经非常成熟和稳定,可以作为长期使用的版本,所以以下所有的使用说明都是针对该版本的。

导入:

dependencies {
    compile 'com.github.bumptech.glide:glide:3.7.0'
}

1、基本加载

String url = "http://img6.3lian.com/c23/desk4/07/01/d/09.jpg";
Glide.with(this).load(url).into(imageView);

Glide最基本的使用方式,其实就是关键的三步走:先with(),再load(),最后into()。

2、占位图placeholder

Glide.with(this)
     .load(url)
     .placeholder(R.drawable.loading)
     .into(imageView);

3、异常占位图error

Glide.with(this)
     .load(url)
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .diskCacheStrategy(DiskCacheStrategy.NONE)//设置不做任何缓存
     .into(imageView);

4、指定图片格式asBitmap/asGif

Glide.with(this)
     .load(url)
     .asBitmap()//指定只显示静态图片
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

PS:注意,加载本地gif图片时需要指定.diskCacheStrategy(DiskCacheStrategy.SOURCE)

5、指定图片大小override

Glide.with(this)
     .load(url)
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .override(100, 100)//.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)原始大小
     .into(imageView);

6、禁用内存缓存skipMemoryCache

Glide.with(this)
     .load(url)
     .skipMemoryCache(true)
     .into(imageView);

7、缓存策略DiskCacheStrategy

  • DiskCacheStrategy.NONE: 表示不缓存任何内容。
  • DiskCacheStrategy.SOURCE: 表示只缓存原始图片。
  • DiskCacheStrategy.RESULT: 表示只缓存转换过后的图片(默认选项)。
  • DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。

8、解决图片url地址带token后缀问题GlideUrl

    token作为一个验证身份的参数并不是一成不变的,很有可能时时刻刻都在变化。而如果token变了,那么图片的url也就跟着变了,图片url变了,缓存Key也就跟着变了。结果就造成了,明明是同一张图片,就因为token不断在改变,导致Glide的缓存功能完全失效了

public class MyGlideUrl extends GlideUrl {
    private String mUrl;
    public MyGlideUrl(String url) {
        super(url);
        mUrl = url;
    }
    @Override
    public String getCacheKey() {
        return mUrl.replace(findTokenParam(), "");
    }
    private String findTokenParam() {
        String tokenParam = "";
        int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");
        if (tokenKeyIndex != -1) {
            int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);
            if (nextAndIndex != -1) {
                tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
            } else {
                tokenParam = mUrl.substring(tokenKeyIndex);
            }
        }
        return tokenParam;
    }
}

使用:

Glide.with(this)
     .load(new MyGlideUrl(url))
     .into(imageView);

9、获取到Glide加载出来的图片对象SimpleTarget

    如果into()里面的参数不是ImageView类型,那就不能直接传入,如大图缩放框架的控件LargeImageView,或者还想对获取到的drawable进行其他处理,可以如下处理:

SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() {
    @Override
    public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
        imageView.setImageDrawable(resource);
    }
};
Glide.with(this)
         .load(url)
         .into(simpleTarget);

10、预加载

    先加载不显示,要显示的时候再显示,注意缓存策略必须设置为DiskCacheStrategy.SOURCE

Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.SOURCE)
     .preload();
Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.SOURCE)
     .into(imageView);

11、只下载不调用Into方法显示

a、子线程执行downloadOnly(int width, int height)

FutureTarget<File> target = Glide.with(context).load(url).downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
final File imageFile = target.get();//此处会等待下载,线程阻塞

显示时调用:

Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.SOURCE)
     .into(imageView);

需要注意的是,这里必须将硬盘缓存策略指定成DiskCacheStrategy.SOURCE或者DiskCacheStrategy.ALL,否则Glide将无法使用我们刚才下载好的图片缓存文件。

b、主线程执行downloadOnly(Y target)

其实downloadOnly(int width, int height)方法必须使用在子线程当中,最主要还是因为它在内部帮我们自动创建了一个RequestFutureTarget,是这个RequestFutureTarget要求必须在子线程当中执行。而downloadOnly(Y target)方法则要求我们传入一个自己创建的Target,因此就不受RequestFutureTarget的限制了。

public class DownloadImageTarget implements Target<File> {
    private static final String TAG = "DownloadImageTarget";
    @Override
    public void onStart() {
    }
    @Override
    public void onStop() {
    }
    @Override
    public void onDestroy() {
    }
    @Override
    public void onLoadStarted(Drawable placeholder) {
    }
    @Override
    public void onLoadFailed(Exception e, Drawable errorDrawable) {
    }
    @Override
    public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) {
        Log.d(TAG, resource.getPath());
    }
    @Override
    public void onLoadCleared(Drawable placeholder) {
    }
    @Override
    public void getSize(SizeReadyCallback cb) {
        cb.onSizeReady(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
    }
    @Override
    public void setRequest(Request request) {
    }
    @Override
    public Request getRequest() {
        return null;
    }
}

使用时:

Glide.with(this)
            .load(url)
            .downloadOnly(new DownloadImageTarget());

12、下载监听listener()方法

    a、listener方式

Glide.with(this)
            .load(url)
            .listener(new RequestListener<String, GlideDrawable>() {
                @Override
                public boolean onException(Exception e, String model, Target<GlideDrawable> target,
                    boolean isFirstResource) {
                    return false;
                }

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

b、GlideDrawableImageViewTarget方式

Glide.with(this)
        .load(url)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
        .into(new GlideDrawableImageViewTarget(image) {
            @Override
            public void onLoadStarted(Drawable placeholder) {
                super.onLoadStarted(placeholder);
            }
            @Override
            public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> animation) {
                super.onResourceReady(resource, animation);
            }
        });

13、图片变换

a、不进行图片变换

Glide.with(this)
    		.load(url)
     		.dontTransform()
     		.into(imageView);

b、指定图片变换

Glide.with(this)
    			 .load(url)
     			.centerCrop()
     			.into(imageView);
		Glide.with(this)
     			.load(url)
   			.fitCenter()
     			.into(imageView);

c、自定义图片变换

需继承BitmapTransformation类重写transform方法
使用时:

Glide.with(this)
     		.load(url)
   		.transform(new CircleCrop(this))//CircleCrop继承了BitmapTransformation类,此处省略实现过程
    		.into(imageView);

d、推荐图片变换框架

裁剪变换、颜色变换、模糊变换等等 https://github.com/wasabeef/glide-transformations

compile 'jp.wasabeef:glide-transformations:2.0.2'//用该版本即可,更高版本对应Glide4.0以上,有冲突

14、自定义缓存大小和缓存路径

public class MyGlideModule implements GlideModule {
   		 public static final int DISK_CACHE_SIZE = 500 * 1024 * 1024;
    		@Override
    		public void applyOptions(Context context, GlideBuilder builder) {
        		builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_SIZE));
   //修改图片加载格式
   //builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
   //注意!如果设置成ARGB_8888格式,上面第13点提到的图片变换框架glide-transformations将失去变换效果
    		}
    		@Override
    		public void registerComponents(Context context, Glide glide) {
    		}
	    }

ExternalCacheDiskCacheFactory的默认缓存路径是在sdcard/Android/包名/cache/image_manager_disk_cache目录当中;Glide加载图片的默认格式是RGB_565,而Picasso加载图片的默认格式是ARGB_8888。ARGB_8888格式的图片效果会更加细腻,但是内存开销会比较大。而RGB_565格式的图片则更加节省内存,但是图片效果上会差一些。
AndroidManifest.xml中配置:

<meta-data
            android:name="包名.MyGlideModule"
            android:value="GlideModule" />

15、组件替换(如通信组件替换为okhttp3.0)及添加进度条

    该部分在郭神的系列博客Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能当中说明地很详细,就不再说明了。

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值