Android图片加载库:最全面解析Glide用法

VictorFalk 7年前
   <p><img src="https://simg.open-open.com/show/374f635f21e2f63ee1efd57bf0db81f2.png"></p>    <h2><strong>前言</strong></h2>    <ul>     <li> <p>上文已经对当今 <strong>Android主流的图片加载库</strong> 进行了全面介绍 & 对比</p> <p>如果你还没阅读,我建议你先移步这里进行查看</p> </li>     <li> <p>今天我们来学习一下其中一个Android主流的图片加载库的使用 - Glide</p> </li>    </ul>    <h2><strong>目录</strong></h2>    <p style="text-align:center"><img src="https://simg.open-open.com/show/0e98629af4a9aab234c7d85c8e351be7.png"></p>    <p>目录</p>    <h2><strong>1. 简介</strong></h2>    <ul>     <li> <p>介绍:Glide,是Android中一个图片加载开源库</p> <p>Google的开源项目</p> </li>     <li>主要作用:实现图片加载</li>    </ul>    <h2><strong>2. 功能特点</strong></h2>    <h2><strong>2.1 功能列表</strong></h2>    <p style="text-align:center"><img src="https://simg.open-open.com/show/ff65bde505ac55168c5d08e8bdb4a525.png"></p>    <p>功能列表</p>    <ul>     <li> <p>从上面可以看出,Glide不仅实现了图片异步加载的功能,还解决了Android中加载图片时需要解决的一些常见问题</p> </li>     <li> <p>接下来,我会对Glide的每个功能点进行详细的介绍</p> </li>    </ul>    <h2><strong>2.2 功能介绍</strong></h2>    <p>2.2.1 关于图片加载</p>    <ul>     <li> <p>图片的异步加载(基础功能)</p> </li>    </ul>    <pre>  <code class="language-java">ImageView targetImageView = (ImageView) findViewById(R.id.ImageView);          String Url = "http://218.192.170.132/1.jpg";    //Glide使用了流式接口的调用方式  //Glide类是核心实现类。          Glide.with(context).load(Url).into(targetImageView);    //实现图片加载功能至少需要三个参数:  //with(Context context)  //Context对于很多Android API的调用都是必须的,这里就不多说了    //load(String imageUrl):被加载图像的Url地址。  //大多情况下,一个字符串代表一个网络图片的URL。    //into(ImageView targetImageView):图片最终要展示的地方。</code></pre>    <ul>     <li> <p>设置加载尺寸</p> <pre>  <code class="language-java">Glide.with(this).load(imageUrl).override(800, 800).into(imageView);</code></pre> </li>    </ul>    <ul>     <li> <p>设置加载中以及加载失败图片</p> <p>api里面对placeholder()、error()函数中有多态实现,用的时候可以具体的熟悉一下</p> <pre>  <code class="language-java">Glide  .with(this)  .load(imageUrl)  .placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);</code></pre> </li>    </ul>    <ul>     <li> <p>设置加载动画</p> <pre>  <code class="language-java">Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);</code></pre> <p>api也提供了几个常用的动画:比如crossFade()</p> <p>R.anim.item_alpha_in</p> <pre>  <code class="language-java"><?xml version="1.0" encoding="utf-8"?>  <set xmlns:android="http://schemas.android.com/apk/res/android">    <alpha        android:duration="500"        android:fromAlpha="0.0"        android:toAlpha="1.0"/>  </set></code></pre> </li>    </ul>    <ul>     <li> <p>设置要加载的内容</p> <p>项目中有很多需要先下载图片然后再做一些合成的功能,比如项目中出现的图文混排,该如何实现目标下</p> </li>    </ul>    <pre>  <code class="language-java">Glide.with(this).load(imageUrl).centerCrop().into(new SimpleTarget<GlideDrawable>() {              @Override              public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {                  imageView.setImageDrawable(resource);              }          });</code></pre>    <p>2.2.2 多样式的媒体加载</p>    <pre>  <code class="language-java">Glide          .with(context)          .load(imageUrl);          .thumbnail(0.1f);//设置缩略图支持:先加载缩略图 然后在加载全图                             //传了一个 0.1f 作为参数,Glide 将会显示原始图像的10%的大小。                            //如果原始图像有 1000x1000 像素,那么缩略图将会有 100x100 像素。          .asBitmap()//显示gif静态图片           .asGif();//显示gif动态图片          .into(imageView);</code></pre>    <p>2.2.3 关于缓存</p>    <ul>     <li> <p>设置磁盘缓存策略</p> <pre>  <code class="language-java">Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);  //缓存参数  //ALL:缓存源资源和转换后的资源(即所有版本,默认行为)  //NONE:不作任何磁盘缓存。然而,默认的它将仍然使用内存缓存!  //SOURCE:仅缓存源资源(原来的全分辨率的图像)。  //在我们上面略缩图的例子中,将会只有一个1000x1000 像素的图片  //RESULT:缓存转换后的资源(最终的图像,即降低分辨率后的(或者是转换后的)</code></pre> </li>     <li> <p>设置跳过内存缓存</p> <pre>  <code class="language-java">Glide  .with(this)  .load(imageUrl)  .skipMemoryCache(true)  .into(imageView);  //设置跳过内存缓存  //这意味着 Glide 将不会把这张图片放到内存缓存中去  //这里需要明白的是,这只是会影响内存缓存!Glide 将会仍然利用磁盘缓存来避免重复的网络请求。</code></pre> </li>     <li> <p>清理缓存</p> <pre>  <code class="language-java">Glide.get(this).clearDiskCache();//清理磁盘缓存 需要在子线程中执行   Glide.get(this).clearMemory();//清理内存缓存 可以在UI主线程中进行</code></pre> </li>    </ul>    <p>2.2.4 其他设置</p>    <ul>     <li> <p>生命周期集成</p> <p>通过设置绑定生命周期,我们可以更加高效的使用Glide提供的方式进行绑定,这样可以更好的让加载图片的请求的生命周期动态管理起来</p> <pre>  <code class="language-java">.with(Context context)// 绑定Context        .with(Activity activity);// 绑定Activity        .with(FragmentActivity activity);// 绑定FragmentActivity        .with(Fragment fragment);// 绑定Fragment</code></pre> <p>注意:</p>      <ol>       <li>传入的context类型影响到Glide加载图片的优化程度</li>       <li>Glide可以监视Activity的生命周期,在Activity销毁的时候自动取消等待中的请求。但是如果你使用Application context,你就失去了这种优化效果。</li>      </ol> </li>    </ul>    <ul>     <li> <p>设置动态转换</p> <pre>  <code class="language-java">Glide.with(this).load(imageUrl).centerCrop().into(imageView);</code></pre> </li>     <li> <p>设置下载优先级</p> <pre>  <code class="language-java">Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);</code></pre> </li>    </ul>    <h2><strong>3. Demo实例</strong></h2>    <p>没有Demo的代码讲解不是好文章,让我们来一步步学会使用Glide。</p>    <p>步骤1:在gradle添加依赖</p>    <pre>  <code class="language-java">compile 'com.github.bumptech.glide:glide:3.7.0'</code></pre>    <p>步骤2:添加网络权限</p>    <pre>  <code class="language-java"><uses-permission android:name="android.permission.INTERNET"/></code></pre>    <p>步骤1和步骤2是Glide使用的前提,千万别忘了!!!!</p>    <p>步骤3:在MainActivity中</p>    <pre>  <code class="language-java">ImageView targetImageView = (ImageView) findViewById(R.id.ImageView);          String Url = "http://218.192.170.132/1.jpg";            Glide                  .with(this)                  .load(Url)                  .into(targetImageView);</code></pre>    <p>还有具体其他功能需要配置的自己按照我上面写的进行配置就好了~</p>    <p>这里再贴上Glide的Github地址: <a href="/misc/goto?guid=4958862736295244246" rel="nofollow,noindex">请点击这里</a></p>    <h2><strong>4. 特点</strong></h2>    <p>4.1 优点</p>    <ul>     <li> <p>多样化媒体加载</p> <p>Glide 不仅是一个图片缓存,它支持 Gif、WebP、缩略图。甚至是 Video</p> </li>     <li> <p>生命周期集成</p> <p>通过设置绑定生命周期,我们可以更加高效的使用Glide提供的方式进行绑定,这样可以更好的让加载图片的请求的生命周期动态管理起来</p> </li>     <li> <p>高效的缓存策略</p> <p>A. 支持Memory和Disk图片缓存</p> <p>B. Picasso 只会缓存原始尺寸的图片,而 Glide 缓存的是多种规格,也就意味着 Glide 会根据你 ImageView 的大小来缓存相应大小的图片尺寸</p> <p>比如你ImageView大小是200 200,原图是400 400 ,而使用Glide就会缓存200 200规格的图,而 Picasso只会缓存400 400规格的。这个改进就会导致Glide比Picasso加载的速度要快,毕竟少了每次裁剪重新渲染的过程,非常灵活 & 加载速度快</p> <p>C. 内存开销小</p> <p>默认的Bitmap格式是RGB_565格式,而Picasso默认的是ARGB_8888格式,这个内存开销要小一半。</p> <p>Android关于图片内存计算,共有四种,分别是:</p>      <ol>       <li> <p>ALPHA_8:每个像素占用1byte内存</p> </li>       <li> <p>ARGB_4444:每个像素占用2byte内存</p> </li>       <li> <p>ARGB_8888:每个像素占用4byte内存(默认,色彩最细腻=显示质量最高=占用的内存也最大)</p> </li>       <li> <p>RGB_565:每个像素占用2byte内存(8bit = 1byte)<br> 举例说明:一个32位的PNG=ARGB_8888=1204x1024,那么占用空间是:1024x1024x(32/8) = 4,194,304kb=4M左右<br> 在解析图片的时候,为了避免oom和节省内存,最好使用ARGB_4444模式(节省一半的内存空间)</p> </li>      </ol> </li>    </ul>    <p>4.2 缺点</p>    <ul>     <li> <p>使用方法复杂<br> 由于Glide其功能强大,所以使用的方法非常多,其源码也相对的复杂</p> </li>     <li> <p>包较大</p> </li>    </ul>    <h2><strong>5. 相比其他图片加载库(Picasso & Fresco)</strong></h2>    <ul>     <li> <p>对比Picasso<br> Glide 是在Picasso 基础之上进行的二次开发做了不少改进,不过这也导致包比 Picasso 大不少,不过也就不到 500k(Picasso 是100多k),用法较为复杂,不过毕竟级别还是蛮小的,影响不是很大</p> </li>     <li> <p>对比Fresco<br> 使用较Fresco简单,但性能(加载速度 & 缓存)却比不上Fresco</p> </li>    </ul>    <h2><strong>6. 应用场景</strong></h2>    <p>根据Glide的特点和与其他图片加载库的对比,可以得出其使用场景:</p>    <ul>     <li> <p>需要更多的内容表现形式(如Gif);</p> </li>     <li> <p>更高的性能要求(缓存 & 加载速度);</p> </li>    </ul>    <p> </p>    <p> </p>    <p> </p>    <p> </p>    <p>来自:http://www.jianshu.com/p/c3a5518b58b2</p>    <p> </p>