博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android Glide图片框架最全使用说明
阅读量:3976 次
发布时间:2019-05-24

本文共 7613 字,大约阅读时间需要 25 分钟。

概述:

    本文的所有内容几乎全部来自郭神的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
simpleTarget = new SimpleTarget
() { @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
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
{ 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
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
() { @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);

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
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中配置:

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

    该部分在郭神的系列博客当中说明地很详细,就不再说明了。

 

 

 

 

 

 

 

 

 

 

转载地址:http://dorki.baihongyu.com/

你可能感兴趣的文章
使用微信api将内容分享给好友,或者发送到朋友圈
查看>>
android开发中输入法的弹出和隐藏
查看>>
Android 如何在自定义界面上启用输入法 (How to enable inputmethod for the custom UI)
查看>>
Android MediaCodec小结
查看>>
YUV格式说明
查看>>
MediaCodec and Camera: colorspaces don't match
查看>>
android adb 读写模式 挂载文件系统
查看>>
onTouchEvent方法的使用
查看>>
Android详细解释键盘和鼠标事件
查看>>
如何成为强大的程序员?
查看>>
打包时sun.misc.ServiceConfigurationError
查看>>
摘自 管理自己[Managing Oneself]
查看>>
程序员开发大型应用程序的技巧
查看>>
远程团队管理的10条戒律
查看>>
在服务器上排除问题的头五分钟
查看>>
Diagnosing DFC Configuration Problems
查看>>
jboss java.lang.NoClassDefFoundError: Could not initialize class com.documentum.fc.client.DfClient
查看>>
芯片常见封装
查看>>
什么是oc门
查看>>
上拉电阻 下拉电阻的汇总
查看>>