glide学习笔记

Glide
.with(this)
.load(url)//可加载file,uri,resource,byte,
.transform(...)//图片变换,如圆角化、圆形化、黑白化、模糊化等等,甚至你将原图片完全替换成另外一张图都是可以的。对于图形变换,github有很好的开源类库glide-transformations,详见:https://blog.csdn.net/guolin_blog/article/details/71524668
.dontTransform()//与transform互斥,加载图片的过程中不进行图片变换,ImageView默认的scaleType为FIT_CENTER
.centerCrop()//按中心进行裁剪,与transform互斥
.fitCenter()//与transform互斥
.asBitmap()//只允许加载静态图,如果资源是GIF,则会加载出gif第一帧.
.asGif()//只允许加载gif图,与asBitmap()互斥,如果资源是静态图,会出错,进入到error
.placeholder(R.drawable.loading)//占位图
.error(R.drawable.error)//加载错误是显示的图
.skipMemoryCache(true)//禁用内存缓存功能,默认是开启的,禁用时,需要手动调用此方法
.diskCacheStrategy(DiskCacheStrategy.NONE)//磁盘缓存策略,DiskCacheStrategy.NONE-表示不缓存任何内容。DiskCacheStrategy.SOURCE-表示只缓存原始图片。DiskCacheStrategy.RESULT-表示只缓存转换过后的图片(默认选项)。DiskCacheStrategy.ALL-表示既缓存原始图片,也缓存转换过后的图片。
.override(100, 100)//指定加载图片的大小,100px*100px
.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(Target)//不仅能加载到imageView,也能加载到自定义的target,与into互斥.
.into(imageView);

问题1:
    虽说Glide将缓存功能高度封装之后,使得用法变得非常简单,但同时也带来了一些问题。比如之前有一位群里的朋友就跟我说过,他们项目的图片资源都是存放在七牛云上面的,而七牛云为了对图片资源进行保护,会在图片url地址的基础之上再加上一个token参数。
解答1:
    我相信大家已经猜到解决方案了,因为getCacheKey()方法中的逻辑太直白了,直接就是将图片的url地址进行返回来作为缓存Key的。那么其实我们只需要重写这个getCacheKey()方法,加入一些自己的逻辑判断,就能轻松解决掉刚才的问题了。
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;
    }

}

问题2:
    glide.with(context).load(url).into(ImageView)只能into到Imageview吗?
解答2:
    使用了这么久的Glide,我们都知道into()方法中是可以传入ImageView的。那么into()方法还可以传入别的参数吗?我可以让Glide加载出来的图片不显示到ImageView上吗?答案是肯定的,这就需要用到自定义Target功能。详见:https://blog.csdn.net/guolin_blog/article/details/70215985
    
问题3:
我希望提前对图片进行一个预加载,等真正需要加载图片的时候就直接从缓存中读取,不想再等待慢长的网络加载时间了,这该怎么办呢?
解答3:
Glide专门给我们提供了预加载的接口,也就是preload()方法,我们只需要直接使用就可以了。

preload()方法有两个方法重载,一个不带参数,表示将会加载图片的原始尺寸,另一个可以通过参数指定加载图片的宽和高。
问题4:如何下载图片
解答4:使用downloadOnly(). 详见:https://blog.csdn.net/guolin_blog/article/details/70215985

问题5: 如何替换glide的组件
解答5: 详见:https://blog.csdn.net/guolin_blog/article/details/78179422

猜你喜欢

转载自blog.csdn.net/u012049463/article/details/83628154