Glide学习归纳 一 基础用法

向guolin大神致敬
guolin大神的Glide专栏全网最全,皮的就不谈了

基本用法:

Glide.with(context)      //也可以用fragment 和activity(涉及到生命周期,建议和F和A绑定)
    .load("http://aa.com/bb/vv.jpg") 
    .into(ivImg);

API介绍

  • .load()
    除了加载url,还可以加载应用资源,本地图片,二进制流,GIF(但是好像有点不好,还没研究)
  • .placeholder(R.drawable.loading)
    加载时的图片

  • .error(R.drawable.error)
    加载失败时的图片

  • .diskCacheStrategy(DiskCacheStrategy.NONE)
    指定磁盘缓存类型 种类见学习归纳二

  • .asBitmap()
    只允许加载静态图片,如果是GIF那只显示第一帧

  • .asGif()
    只允许加载GIF,如果是静态图片显示错误

  • .override(100, 100)
    指定图片大小(全段照抄,觉得写的太好了 )

实际上,使用Glide在绝大多数情况下我们都是不需要指定图片大小的。
在学习本节内容之前,你可能还需要先了解一个概念,就是我们平时在加载图片的时候很容易会造成内存浪费。什么叫内存浪费呢?比如说一张图片的尺寸是1000 *1000像素,但是我们界面上的ImageView可能只有200 * 200像素,这个时候如果你不对图片进行任何压缩就直接读取到内存中,这就属于内存浪费了,因为程序中根本就用不到这么高像素的图片。

关于图片压缩这方面,我之前也翻译过Android官方的一篇文章,感兴趣的朋友可以去阅读一下 Android高效加载大图、多图解决方案,有效避免程序OOM 。

而使用Glide,我们就完全不用担心图片内存浪费,甚至是内存溢出的问题。因为Glide从来都不会直接将图片的完整尺寸全部加载到内存中,而是用多少加载多少。Glide会自动判断ImageView的大小,然后只将这么大的图片像素加载到内存当中,帮助我们节省内存开支。

当然,Glide也并没有使用什么神奇的魔法,它内部的实现原理其实就是上面那篇文章当中介绍的技术,因此掌握了最基本的实现原理,你也可以自己实现一套这样的图片压缩机制。

也正是因为Glide是如此的智能,所以刚才在开始的时候我就说了,在绝大多数情况下我们都是不需要指定图片大小的,因为Glide会自动根据ImageView的大小来决定图片的大小。

不过,如果你真的有这样的需求,必须给图片指定一个固定的大小,Glide仍然是支持这个功能的。使用.override即可。这里使用override()方法指定了一个图片的尺寸,也就是说,Glide现在只会将图片加载成100*100像素的尺寸,而不会管你的ImageView的大小是多少了。

  • .skipMemoryCache(true)
    关闭内存缓存,Glide是默认打开内存缓存

  • .preload()
    当我们因为某些原因或者效果需要提前下载好图片,等到需要显示的时候,不想等待漫长的网络加载时间,就可以使用.preload()。
    用法:(不和.into()一起使用)

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

等到需要使用时:

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

此处需要说明的是:这里的.diskCacheStrategy最好使用到DiskCacheStrategy.SOURCE这个类型。因为preload()默认下载的是原尺寸的图。而.into()则会根据图片的大小来决定加载图片的大小。所以如果不把diskCacheStrategy都设置成DiskCacheStrategy.SOURCE,则会出现即使我预下载好了之后使用into()设置图片时,但是仍然会去去从网络请求图片。

  • .downloadOnly(int width, int height)
public void downloadImage(View view) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
                final Context context = getApplicationContext();
                FutureTarget target = Glide.with(context)
                                                 .load(url)
                                                 .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
                final File imageFile = target.get();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(context, imageFile.getPath(), Toast.LENGTH_LONG).show();
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
}

需要注意:

1.context需要为getApplicationContxt();不然可能会有内存泄漏
2.返回值是一个FutureTarget对象。调用get()即可获得图片文件路径。但是如果图片未下载完,则这个方法会被阻塞。所以使用downloadOnly()时,需要开个子线程运行。

你可能感兴趣的:(Glide学习归纳 一 基础用法)