图片加载框架,Glide


        <div class="markdown_views"><p>在<a href="http://lib.csdn.net/base/android" class="replace_word" title="Android知识库" target="_blank" style="color:#df3434; font-weight:bold;">Android</a>设备上,加载网络图片一直是一个头疼的问题,因为Android设备种类繁多(当然最主要的是配置),处理的稍不周到轻则应用卡顿,严重者就会出现OOM的,导致程序挂掉。现如今网络上有很多图片库,如 <a href="https://github.com/nostra13/Android-Universal-Image-Loader">Universal-Image-Loader</a>,<a href="https://github.com/square/picasso">Picasso</a>,<a href="https://github.com/facebook/fresco">Fresco</a>,<a href="https://github.com/bumptech/glide">Glide</a>等等。相信列举出的这几个库大家都不陌生,这也是目前最火的图片库了。由于个人的喜好原因(主要是别人介绍说Glide库比较NB),所以就开始研究学习Glide。</p>

<p>Glide库和Picasso库有极大的相似性,编码风格也几近相同,不过Glide缺有着更为强大的功能。它在缓存处理方面有着很大的优势并且支持加载Gif动画以及本地Video。这个库在谷歌开源库中也有应用。如此好东西,心动不如行动,现在开始我们的学习之旅吧。</p>

<hr>

<p><a href="https://github.com/xiehui999/GlideDemo">源码【传送门】</a></p>

<p>如果想更深入学习Glide,可继续阅读下一篇文章</p>

<p><strong><em><a href="http://blog.csdn.net/xiehuimx/article/details/52550990">详谈高大上的图片加载框架Glide -源码篇</a></em></strong></p>

<hr>

<h2 id="配置"><a name="t0"></a>配置</h2>

<p>使用Glide的第一步是现在我们的builde.gradle</p>



<pre class="prettyprint" name="code"><code class="hljs matlab has-numbering">dependencies <span class="hljs-cell">{
  compile <span class="hljs-string">'com.github.bumptech.glide:glide:3.7.0'</span>
  compile <span class="hljs-string">'com.android.support:support-v4:19.1.0'</span>
}</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li></ul></pre>

<p>配置gradle文件后,我们就可以使用Glide了。上代码</p>



<pre class="prettyprint" name="code"><code class="hljs sql has-numbering">Glide.with(context).<span class="hljs-operator"><span class="hljs-keyword">load</span>(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/51.jpg"</span>).<span class="hljs-keyword">into</span>(imageView);</span></code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>

<p>看着很简单吧,一句话就可以实现图片下载和展示。我们看到Glide使用<a href="http://www.importnew.com/11506.html">建造者模式</a>加载图片。</p>



<pre class="prettyprint" name="code"><code class="hljs vhdl has-numbering">RequestManager <span class="hljs-keyword">with</span>(<span class="hljs-keyword">Context</span> <span class="hljs-keyword">context</span>)
RequestManager <span class="hljs-keyword">with</span>(Activity activity)
RequestManager <span class="hljs-keyword">with</span>(FragmentActivity activity)</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul></pre>

<p>我们看到with()可接受三种参数,这也是Glide的亮点,它能根据传入参数Activity/Fragment的生命周期保持一致,去暂停和执行图片加载,这也节省了不必要的流量浪费。</p>



<h2 id="加载图片方式"><a name="t1"></a>加载图片方式</h2>



<pre class="prettyprint" name="code"><code class="hljs livecodeserver has-numbering">DrawableTypeRequest&lt;String&gt; <span class="hljs-built_in">load</span>(String <span class="hljs-keyword">string</span>)
DrawableTypeRequest&lt;Uri&gt; <span class="hljs-built_in">load</span>(Uri uri)
DrawableTypeRequest&lt;File&gt; <span class="hljs-built_in">load</span>(File <span class="hljs-built_in">file</span>)
DrawableTypeRequest&lt;Integer&gt; <span class="hljs-built_in">load</span>(Integer resourceId)
DrawableTypeRequest&lt;<span class="hljs-built_in">URL</span>&gt; <span class="hljs-built_in">load</span>(<span class="hljs-built_in">URL</span> url)
</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul></pre>



<h3 id="string参数加载"><a name="t2"></a>String参数加载</h3>



<pre class="prettyprint" name="code"><code class="hljs sql has-numbering">Glide.with(this).<span class="hljs-operator"><span class="hljs-keyword">load</span>(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/51.jpg"</span>).<span class="hljs-keyword">into</span>(imageView);</span></code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>



<h3 id="资源文件加载"><a name="t3"></a>资源文件加载</h3>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering"> int  resourceId=R<span class="hljs-preprocessor">.mipmap</span><span class="hljs-preprocessor">.image</span><span class="hljs-comment">;</span>
 Glide<span class="hljs-preprocessor">.with</span>(context)<span class="hljs-preprocessor">.load</span>(resourceId)<span class="hljs-preprocessor">.into</span>(imageView)<span class="hljs-comment">;</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul></pre>



<h3 id="本地文件加载"><a name="t4"></a>本地文件加载</h3>



<pre class="prettyprint" name="code"><code class="hljs vhdl has-numbering"><span class="hljs-keyword">File</span> <span class="hljs-keyword">file</span> = <span class="hljs-keyword">new</span> <span class="hljs-keyword">File</span>(Environment.getExternalStorageDirectory() + <span class="hljs-keyword">File</span>.separator +  <span class="hljs-string">"image"</span>, <span class="hljs-string">"image.jpg"</span>);
Glide.<span class="hljs-keyword">with</span>(this).load(<span class="hljs-keyword">file</span>).into(imageView);</code><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul></pre>



<h3 id="uri加载"><a name="t5"></a>Uri加载</h3>



<pre class="prettyprint" name="code"><code class="hljs vhdl has-numbering"><span class="hljs-keyword">File</span> <span class="hljs-keyword">file</span> = <span class="hljs-keyword">new</span> <span class="hljs-keyword">File</span>(Environment.getExternalStorageDirectory() + <span class="hljs-keyword">File</span>.separator +  <span class="hljs-string">"image"</span>, <span class="hljs-string">"image.jpg"</span>);
Uri uri = Uri.fromFile(<span class="hljs-keyword">file</span>);
Glide.<span class="hljs-keyword">with</span>(this).load(uri).into(imageView);//uri加载方式</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul></pre>



<h3 id="url方式"><a name="t6"></a>URL方式</h3>

<p>该方式在源码中已经标记@Deprecated</p>



<pre class="prettyprint" name="code"><code class="hljs cs has-numbering">        <span class="hljs-keyword">try</span> {
           url=<span class="hljs-keyword">new</span> URL(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/51.jpg"</span>);
        } <span class="hljs-keyword">catch</span> (MalformedURLException e) {
            e.printStackTrace();
        }
    Glide.with(<span class="hljs-keyword">this</span>).load(url).<span class="hljs-keyword">into</span>(imageView);<span class="hljs-comment">//URL加载方式    </span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul></pre>



<h2 id="设置占位图片"><a name="t7"></a>设置占位图片</h2>

<p>在上面的处理中,我们之间将加载成功的图片展示到ImageView,这样会不会看起来很突兀?是的,Glide为我们提供了设置占位符,他可以让我们知道图片是否加载成功,等</p>



<h3 id="placeholder"><a name="t8"></a>placeholder</h3>

<p>我们都知道,图片加载是不确定的,加载成功需要的时间也是不确定的,而在加载这段时间,我们可以通过placeholder设置给ImageView一个占位符,图片上可以提示正在加载中之类的,当然可以任何你要的效果,</p>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">Glide<span class="hljs-preprocessor">.with</span>(context)<span class="hljs-preprocessor">.load</span>(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/55.jpg"</span>)<span class="hljs-preprocessor">.placeholder</span>(R<span class="hljs-preprocessor">.mipmap</span><span class="hljs-preprocessor">.place</span>)<span class="hljs-preprocessor">.into</span>(imageView)<span class="hljs-comment">;</span></code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>



<h3 id="error"><a name="t9"></a>error</h3>

<p>当然除了加载成功前我们设置了占位符,那么如果加载错误(网络原因及url非法原因等导致图片没有加载成功),我们填充一个图片到ImageView提示用户当前图片加载失败。</p>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">Glide<span class="hljs-preprocessor">.with</span>(context)<span class="hljs-preprocessor">.load</span>(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/55.jpg"</span>)<span class="hljs-preprocessor">.error</span>(R<span class="hljs-preprocessor">.mipmap</span><span class="hljs-preprocessor">.error</span>)<span class="hljs-preprocessor">.into</span>(imageView)<span class="hljs-comment">;</span></code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>

<p>此时你可能想如何知道图片加载失败的具体原因呢?Glide为我们提供了listener()方法,接收RequestListener对象</p>



<pre class="prettyprint" name="code"><code class="hljs java has-numbering">        <span class="hljs-comment">//设置错误监听</span>
         RequestListener&lt;String,GlideDrawable&gt; errorListener=<span class="hljs-keyword">new</span> RequestListener&lt;String, GlideDrawable&gt;() {
            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onException</span>(Exception e, String model, Target&lt;GlideDrawable&gt; target, <span class="hljs-keyword">boolean</span> isFirstResource) {

                Log.e(<span class="hljs-string">"onException"</span>,e.toString()+<span class="hljs-string">"  model:"</span>+model+<span class="hljs-string">" isFirstResource: "</span>+isFirstResource);
                imageView.setImageResource(R.mipmap.ic_launcher);
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
            }

            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onResourceReady</span>(GlideDrawable resource, String model, Target&lt;GlideDrawable&gt; target, <span class="hljs-keyword">boolean</span> isFromMemoryCache, <span class="hljs-keyword">boolean</span> isFirstResource) {
                Log.e(<span class="hljs-string">"onResourceReady"</span>,<span class="hljs-string">"isFromMemoryCache:"</span>+isFromMemoryCache+<span class="hljs-string">"  model:"</span>+model+<span class="hljs-string">" isFirstResource: "</span>+isFirstResource);
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
            }
        } ;</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul></pre>

<p>我们看到有两个回调方法,通过onException是图片加载异常回调,onResourceReady是加载成功的回调。我们可以<a href="http://lib.csdn.net/base/softwaretest" class="replace_word" title="软件测试知识库" target="_blank" style="color:#df3434; font-weight:bold;">测试</a>不同情况打印的日志</p>

<ul>
<li>正确的url首次加载</li>
</ul>



<pre class="prettyprint" name="code"><code class="hljs ruby has-numbering"><span class="hljs-symbol">onResourceReady:</span> <span class="hljs-symbol">isFromMemoryCache:</span><span class="hljs-keyword">false</span>  <span class="hljs-symbol">model:</span><span class="hljs-symbol">http:</span>/<span class="hljs-regexp">/img2.3lian.com/</span><span class="hljs-number">2014</span>/f6/<span class="hljs-number">173</span>/d/<span class="hljs-number">51</span>.jpg <span class="hljs-symbol">isFirstResource:</span> <span class="hljs-keyword">true</span></code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>

<ul>
<li>正确的url第二次加载</li>
</ul>



<pre class="prettyprint" name="code"><code class="hljs ruby has-numbering"><span class="hljs-symbol">onResourceReady:</span> <span class="hljs-symbol">isFromMemoryCache:</span><span class="hljs-keyword">true</span>  <span class="hljs-symbol">model:</span><span class="hljs-symbol">http:</span>/<span class="hljs-regexp">/img2.3lian.com/</span><span class="hljs-number">2014</span>/f6/<span class="hljs-number">173</span>/d/<span class="hljs-number">51</span>.jpg <span class="hljs-symbol">isFirstResource:</span> <span class="hljs-keyword">true</span></code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>

<ul>
<li>错误的url</li>
</ul>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering"><span class="hljs-label">onException:</span> java<span class="hljs-preprocessor">.io</span><span class="hljs-preprocessor">.IOException</span>: Request failed <span class="hljs-number">404</span>: Not Found  model:http://img2<span class="hljs-number">.3</span>lian<span class="hljs-preprocessor">.com</span>/<span class="hljs-number">2014</span>/f6/<span class="hljs-number">173</span>/d/<span class="hljs-number">511.</span>jpg isFirstResource: true</code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>

<ul>
<li>错误的url(非图片类型url)</li>
</ul>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering"><span class="hljs-label">onException:</span> java<span class="hljs-preprocessor">.io</span><span class="hljs-preprocessor">.FileNotFoundException</span>: No such file <span class="hljs-keyword">or</span> directory  model:www<span class="hljs-preprocessor">.baidu</span><span class="hljs-preprocessor">.com</span> isFirstResource: true</code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>

<ul>
<li>无网络</li>
</ul>



<pre class="prettyprint" name="code"><code class="hljs livecodeserver has-numbering">onException: java.net.UnknownHostException: Unable <span class="hljs-built_in">to</span> resolve host <span class="hljs-string">"img2.3lian.com"</span>: No address associated <span class="hljs-operator">with</span> hostname  model:<span class="hljs-keyword">http</span>://img2<span class="hljs-number">.3</span>lian.com/<span class="hljs-number">2014</span>/f6/<span class="hljs-number">173</span>/d/<span class="hljs-number">51.</span>jpg isFirstResource: <span class="hljs-constant">true</span></code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>

<p>通过日志我们很容易看出异常的原因,因此,我们可以针对不同的操作情形,书写自己的处理给用户反馈。</p>



<h3 id="crossfade"><a name="t10"></a>crossFade</h3>

<p>通过上面的分析,我们实现了占位图填充ImageView,但是我们依然发现其中有些不足,因为图片的转换并没有实现平滑过渡效果,实际新api已经默认实现一个渐入渐出的动画效果,默认是300ms.</p>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">Glide<span class="hljs-preprocessor">.with</span>(context)<span class="hljs-preprocessor">.load</span>(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/51.jpg"</span>)<span class="hljs-preprocessor">.error</span>(R<span class="hljs-preprocessor">.mipmap</span><span class="hljs-preprocessor">.error</span>)<span class="hljs-preprocessor">.placeholder</span>(R<span class="hljs-preprocessor">.mipmap</span><span class="hljs-preprocessor">.place</span>)<span class="hljs-preprocessor">.crossFade</span>()<span class="hljs-preprocessor">.into</span>(imageView)<span class="hljs-comment">;</span></code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>

<p>crossFade()还可以接收一个int型的参数,用它来指定动画执行的时间,例如我们设置动画执行的时间是2s</p>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">Glide<span class="hljs-preprocessor">.with</span>(context)<span class="hljs-preprocessor">.load</span>(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/51.jpg"</span>)<span class="hljs-preprocessor">.error</span>(R<span class="hljs-preprocessor">.mipmap</span><span class="hljs-preprocessor">.error</span>)<span class="hljs-preprocessor">.placeholder</span>(R<span class="hljs-preprocessor">.mipmap</span><span class="hljs-preprocessor">.place</span>)<span class="hljs-preprocessor">.crossFade</span>(<span class="hljs-number">2000</span>)<span class="hljs-preprocessor">.into</span>(imageView)<span class="hljs-comment">;</span></code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>

<p>既然我们能添加一个渐入渐出的动画效果,那么如果想直接显示图片而没有任何淡入淡出效果,该作何处理,我们可以使用dontAnimate()方法,这是直接显示你的图片,而不是淡入显示到 ImageView。</p>



<h2 id="图片调整"><a name="t11"></a>图片调整</h2>

<p>Glide加载图片大小是自动调整的,他根据ImageView的尺寸自动调整加载的图片大小,并且缓存的时候也是按图片大小缓存,每种尺寸都会保留一份缓存,如果图片不会自动适配到 ImageView,调用 override(horizontalSize, verticalSize) 。这将在图片显示到 ImageView之前重新改变图片大小</p>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">        //Glide<span class="hljs-preprocessor">.with</span>(context)<span class="hljs-preprocessor">.load</span>(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/51.jpg"</span>)<span class="hljs-preprocessor">.dontAnimate</span>()<span class="hljs-preprocessor">.override</span>(<span class="hljs-number">400</span>,<span class="hljs-number">600</span>)<span class="hljs-preprocessor">.fitCenter</span>()<span class="hljs-preprocessor">.into</span>(imageView)<span class="hljs-comment">;</span>
</code><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul></pre>

<p>注意override接收的参数是像素(px)</p>



<h3 id="缩放"><a name="t12"></a>缩放</h3>

<p>对于任何图像操作,调整大小可能让图片失真。但是我们要尽可能的避免发生这种情况发生。Glide 提供了两个图形装换的操作提供了两个标准选项:centerCrop 和 fitCenter</p>

<ul>
<li>centerCrop  <br>
这个方法是裁剪图片,当图片比ImageView大的时候,他把把超过ImageView的部分裁剪掉,尽可能的让ImageView 完全填充,但图像可能不会全部显示</li>
</ul>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">        Glide<span class="hljs-preprocessor">.with</span>(context)<span class="hljs-preprocessor">.load</span>(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/51.jpg"</span>)<span class="hljs-preprocessor">.centerCrop</span>()<span class="hljs-preprocessor">.into</span>(imageView)<span class="hljs-comment">;</span>
</code><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul></pre>

<ul>
<li>fitCenter <br>
它会自适应ImageView的大小,并且会完整的显示图片在ImageView中,但是ImageView可能不会完全填充</li>
</ul>



<h2 id="加载gif"><a name="t13"></a>加载Gif</h2>

<p>加载Gif动画也是Glide的一大优势,它很简单的就能实现Gif的加载与显示</p>



<pre class="prettyprint" name="code"><code class="hljs sql has-numbering">加载Gif文件
Glide.with(context).<span class="hljs-operator"><span class="hljs-keyword">load</span>(<span class="hljs-string">"http://img1.3lian.com/2015/w4/17/d/64.gif"</span>).<span class="hljs-keyword">into</span>(imageView);</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul></pre>

<p>是不是很简单,依然是一句话就实现显示网络上Gif功能。Glide还提供了Gif相关操作的两个方法。如果我们想将Gif显示成图片的第一帧只需要使用asBitmap()方法即可。如果我们有这个需求,就是严格显示成Gif,那么当传入了一个非Gif 的url时,我们当做错误处理。此时我们可以使用asGif()方法</p>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">        Glide<span class="hljs-preprocessor">.with</span>(context)<span class="hljs-preprocessor">.load</span>(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/51.jpg"</span>)<span class="hljs-preprocessor">.asGif</span>()<span class="hljs-preprocessor">.error</span>(R<span class="hljs-preprocessor">.mipmap</span><span class="hljs-preprocessor">.error</span>)<span class="hljs-preprocessor">.placeholder</span>(R<span class="hljs-preprocessor">.mipmap</span><span class="hljs-preprocessor">.place</span>)<span class="hljs-preprocessor">.into</span>(imageView)<span class="hljs-comment">;</span>
</code><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul></pre>

<p>Glide 将会把这个 load 当成失败处理。这样做的的好处是,.error() 回调被调用并且错误占位符被显示,如果url是Gif,那么会没什么变化,这样就检查了load参数是否为Gif.</p>



<h2 id="glide网络加载方式"><a name="t14"></a>Glide网络加载方式</h2>

<p>Glide内部默认是通过HttpURLConnection网络方式加载图片的,并且支持<a href="https://github.com/square/okhttp">OkHttp</a><a href="https://github.com/mcxiaoke/android-volley">,Volley</a></p>



<h3 id="集成okhttp"><a name="t15"></a>集成OkHttp</h3>

<p>在gradle文件加入下面代码</p>



<pre class="prettyprint" name="code"><code class="hljs cs has-numbering">    <span class="hljs-comment">//自动集成okhttp</span>
    compile <span class="hljs-string">'com.github.bumptech.glide:okhttp-integration:1.4.0@aar'</span>
    compile <span class="hljs-string">'com.squareup.okhttp:okhttp:2.2.0'</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul></pre>



<h3 id="集成volley"><a name="t16"></a>集成Volley</h3>



<pre class="prettyprint" name="code"><code class="hljs cs has-numbering">    <span class="hljs-comment">//自动集成volley</span>
    compile <span class="hljs-string">'com.github.bumptech.glide:volley-integration:1.4.0@aar'</span>
    compile <span class="hljs-string">'com.mcxiaoke.volley:library:1.0.19'</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul></pre>

<p>Gradle 会自动合并必要的 GlideModule 到Android.Manifest。Glide 会认可在 manifest 中的存在,然后使用 所集成的网络连接。</p>



<h2 id="自定义动画"><a name="t17"></a>自定义动画</h2>

<p>在前面我们已经提到过Glide提供了一个渐入渐出的动画效果,当然该动画不是那么酷炫,而且有时并不能达到我们想要的效果,不过Glide给我们提供了animate()方法,我们可以通过此方法实现我们自定义的动画效果。</p>



<h3 id="animateint-animationid"><a name="t18"></a>animate(int animationId)</h3>



<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-pi">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-title">set</span> <span class="hljs-attribute">xmlns:android</span>=<span class="hljs-value">"http://schemas.android.com/apk/res/android"</span>
    <span class="hljs-attribute">android:fillAfter</span>=<span class="hljs-value">"false"</span>
    <span class="hljs-attribute">android:duration</span>=<span class="hljs-value">"3000"</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-title">scale
</span>        <span class="hljs-attribute">android:duration</span>=<span class="hljs-value">"@android:integer/config_longAnimTime"</span>
        <span class="hljs-attribute">android:fromXScale</span>=<span class="hljs-value">"0.1"</span>
        <span class="hljs-attribute">android:fromYScale</span>=<span class="hljs-value">"0.1"</span>
        <span class="hljs-attribute">android:pivotX</span>=<span class="hljs-value">"50%"</span>
        <span class="hljs-attribute">android:pivotY</span>=<span class="hljs-value">"50%"</span>
        <span class="hljs-attribute">android:toXScale</span>=<span class="hljs-value">"1"</span>
        <span class="hljs-attribute">android:toYScale</span>=<span class="hljs-value">"1"</span>/&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">rotate
</span>        <span class="hljs-attribute">android:fromDegrees</span>=<span class="hljs-value">"0"</span>
        <span class="hljs-attribute">android:toDegrees</span>=<span class="hljs-value">"90"</span>
        <span class="hljs-attribute">android:pivotX</span>=<span class="hljs-value">"50%"</span>
        <span class="hljs-attribute">android:pivotY</span>=<span class="hljs-value">"50%"</span>
        /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-title">set</span>&gt;</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li></ul></pre>

<p>上面我们实现了一个图片从小变大并且有一个旋转效果的动画,当然你可以在此文件书写任何你想要实现的动画。</p>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">        Glide<span class="hljs-preprocessor">.with</span>(context)<span class="hljs-preprocessor">.load</span>(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/51.jpg"</span>)<span class="hljs-preprocessor">.animate</span>(R<span class="hljs-preprocessor">.anim</span><span class="hljs-preprocessor">.anim</span>)<span class="hljs-preprocessor">.into</span>(imageView)<span class="hljs-comment">;</span>
</code><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul></pre>



<h3 id="java文件设置动画"><a name="t19"></a>java文件设置动画</h3>

<p>我们也可以通过Animator实现动画,如下</p>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">        //java文件设置动画
        ViewPropertyAnimation<span class="hljs-preprocessor">.Animator</span> animator=new ViewPropertyAnimation<span class="hljs-preprocessor">.Animator</span>() {
            @Override
            public void animate(View view) {
              view<span class="hljs-preprocessor">.setAlpha</span>(<span class="hljs-number">0</span>f)<span class="hljs-comment">;</span>
                ObjectAnimator fadeAnim = ObjectAnimator<span class="hljs-preprocessor">.ofFloat</span>( view, <span class="hljs-string">"alpha"</span>, <span class="hljs-number">0</span>f, <span class="hljs-number">1</span>f )<span class="hljs-comment">;</span>
                fadeAnim<span class="hljs-preprocessor">.setDuration</span>( <span class="hljs-number">2500</span> )<span class="hljs-comment">;</span>
                fadeAnim<span class="hljs-preprocessor">.start</span>()<span class="hljs-comment">;</span>
            }
        }<span class="hljs-comment">;</span>
        Glide<span class="hljs-preprocessor">.with</span>(context)<span class="hljs-preprocessor">.load</span>(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/51.jpg"</span>)<span class="hljs-preprocessor">.animate</span>(animator)<span class="hljs-preprocessor">.into</span>(imageView)<span class="hljs-comment">;</span>
</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul></pre>



<h2 id="target"><a name="t20"></a>Target</h2>

<p>Glide不但可以把图片、视频剧照、GIF动画加载到View,还可以加载到自定义的Target实现中。Target就是使用Glide获取到资源之后资源作用的目标,我们通常是用Glide加载完资源后显示到ImageView中,这个ImageView就是目标.</p>



<h3 id="simpletarget"><a name="t21"></a>SimpleTarget</h3>



<pre class="prettyprint" name="code"><code class="hljs java has-numbering">        <span class="hljs-comment">//SimpleTarget</span>
        SimpleTarget target = <span class="hljs-keyword">new</span> SimpleTarget&lt;Drawable&gt;(){
            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onResourceReady</span>(Drawable resource, GlideAnimation&lt;? <span class="hljs-keyword">super</span> Drawable&gt; glideAnimation) {
                textView.setBackground(resource);
            }
        };
       Glide.with(context)
                .load(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/51.jpg"</span>)
                .animate(animator)
                .into(target);</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul></pre>

<p>上面的代码我们将TextView作为Target,将加载的图片设为背景,对于SimpleTarget是接收的泛型数据,如果我们需要Bitmap对象,我们将泛型为Bitmap.以及其它我们想要的类型。 <br>
我们还可以指定加载的宽和高,如下,设置宽和高都是100,单位是px</p>



<pre class="prettyprint" name="code"><code class="hljs java has-numbering">        SimpleTarget target = <span class="hljs-keyword">new</span> SimpleTarget&lt;Drawable&gt;(<span class="hljs-number">100</span>,<span class="hljs-number">100</span>){
            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onResourceReady</span>(Drawable resource, GlideAnimation&lt;? <span class="hljs-keyword">super</span> Drawable&gt; glideAnimation) {
                textView.setBackground(resource);
            }
        };</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul></pre>



<h3 id="viewtarget"><a name="t22"></a>ViewTarget</h3>

<p>如果你想加载一个图片到View中,但是你想观察或者覆盖Glide的默认行为。你可以覆盖ViewTarget或者它的子类。 <br>
当你想让Glide来获取view的的大小,但是由自己来启动动画和设置资源到view中,ViewTarget是个不错的选择。如果你要加载一个图片到ImageView之外的自定义view中,那么ImageViewTarget或者它的子类就不能满足你的要求,此时继承ViewTarget就特别合适。 <br>
你可以静态的定义一个ViewTarget的子类,或者传递一个匿名内部类到你的加载调用里:</p>



<pre class="prettyprint" name="code"><code class="hljs sql has-numbering">Glide.with(yourFragment)
    .<span class="hljs-operator"><span class="hljs-keyword">load</span>(yourUrl)
    .<span class="hljs-keyword">into</span>(new ViewTarget&lt;YourViewClass, GlideDrawable&gt;(yourViewObject) {
        @Override
        <span class="hljs-keyword">public</span> void onResourceReady(GlideDrawable resource, GlideAnimation anim) {
            YourViewClass myView = this.<span class="hljs-keyword">view</span>;</span>
            // <span class="hljs-operator"><span class="hljs-keyword">Set</span> your resource <span class="hljs-keyword">on</span> myView <span class="hljs-keyword">and</span>/<span class="hljs-keyword">or</span> <span class="hljs-keyword">start</span> your animation here.
        }
    });</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul></pre>

<p>说明: <br>
加载一张静态的图片或者一张GIF动态图,可以在load后面加上asBitmap()/asGif() <br>
.Load(url)会通过asXXX()替换ViewTarget当中的GlideDrawable参数,也可以通过实现LifecycleLisener,给target设置一个回调</p>



<h2 id="转换-transform"><a name="t23"></a>转换 transform</h2>

<p>在图片显示之前,我们可以通过transform对图像做一些处理,达到我们想要的图片效果,例如我们改变图片的大小,范围,颜色等。Glide提供了两种基本的图片转换即:fitCenter 和 centerCrop,前面已介绍过。这次我们来了解如何自定义转换效果,例如如果我们想展示一个圆形图片或者一个具有圆角的图片该如何处理?(圆形头像) <br>
为了自定义转换,我们需要创建一个新的类实现了 Transformation 接口。不过如果我们只是做图片的转换可以直接用Glide封装好的BitmapTransformation抽象类。图像转换操作只需要在transform里实现。getId() 方法描述了这个转换的唯一标识符。Glide 使用该键作为缓存系统的一部分,为了避免意外的问题,你要确保它是唯一的 <br>
接下来先实现一个圆角的图片</p>

<p>推荐一个开源的转换库glide-transformations,它实现了很多转换,我们只要集成直接使用  <a href="https://github.com/wasabeef/glide-transformations">glide-transformationsGithub地址</a> <br>
<img src="https://img-blog.csdn.net/20160829164424144" alt="这里写图片描述" title=""></p>



<pre class="prettyprint" name="code"><code class="hljs java has-numbering"> <span class="hljs-javadoc">/**
     * 将图像转换为四个角有弧度的图像
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">GlideRoundTransform</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">BitmapTransformation</span> {</span>
        <span class="hljs-keyword">private</span> <span class="hljs-keyword">float</span> radius = <span class="hljs-number">0</span>f;

        <span class="hljs-keyword">public</span> <span class="hljs-title">GlideRoundTransform</span>(Context context) {
            <span class="hljs-keyword">this</span>(context, <span class="hljs-number">100</span>);
        }

        <span class="hljs-keyword">public</span> <span class="hljs-title">GlideRoundTransform</span>(Context context, <span class="hljs-keyword">int</span> dp) {
            <span class="hljs-keyword">super</span>(context);
            <span class="hljs-keyword">this</span>.radius = Resources.getSystem().getDisplayMetrics().density * dp;
        }

        <span class="hljs-annotation">@Override</span>
        <span class="hljs-keyword">protected</span> Bitmap <span class="hljs-title">transform</span>(BitmapPool pool, Bitmap toTransform, <span class="hljs-keyword">int</span> outWidth, <span class="hljs-keyword">int</span> outHeight) {
            <span class="hljs-keyword">return</span> roundCrop(pool, toTransform);
        }

        <span class="hljs-keyword">private</span> Bitmap <span class="hljs-title">roundCrop</span>(BitmapPool pool, Bitmap source) {
            <span class="hljs-keyword">if</span> (source == <span class="hljs-keyword">null</span>) <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;

            Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
            <span class="hljs-keyword">if</span> (result == <span class="hljs-keyword">null</span>) {
                result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
            }
            Canvas canvas = <span class="hljs-keyword">new</span> Canvas(result);
            Paint paint = <span class="hljs-keyword">new</span> Paint();
            paint.setShader(<span class="hljs-keyword">new</span> BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
            paint.setAntiAlias(<span class="hljs-keyword">true</span>);
            RectF rectF = <span class="hljs-keyword">new</span> RectF(<span class="hljs-number">0</span>f, <span class="hljs-number">0</span>f, source.getWidth(), source.getHeight());
            canvas.drawRoundRect(rectF, radius, radius, paint);
            Log.e(<span class="hljs-string">"11aa"</span>, radius + <span class="hljs-string">""</span>);
            <span class="hljs-keyword">return</span> result;
        }

        <span class="hljs-annotation">@Override</span>
        <span class="hljs-keyword">public</span> String <span class="hljs-title">getId</span>() {
            <span class="hljs-keyword">return</span> getClass().getName() + Math.round(radius);
        }
    }
        Glide.with(context).load(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/51.jpg"</span>).centerCrop().transform(<span class="hljs-keyword">new</span> GlideRoundTransform(<span class="hljs-keyword">this</span>,<span class="hljs-number">50</span>)).animate(animator).into(imageView);
</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li></ul></pre>

<p>当然如果我们想实现成一个圆形的头像,只需要在上面基础上稍微调整即可。那么如何旋转图片呢如下</p>



<pre class="prettyprint" name="code"><code class="hljs java has-numbering">  <span class="hljs-javadoc">/**
     *将图像做旋转操作
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">GlideRotateTransform</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">BitmapTransformation</span> {</span>
        <span class="hljs-keyword">private</span> <span class="hljs-keyword">float</span> rotateAngle = <span class="hljs-number">0</span>f;

        <span class="hljs-keyword">public</span> <span class="hljs-title">GlideRotateTransform</span>(Context context) {
            <span class="hljs-keyword">this</span>(context, <span class="hljs-number">90</span>);
        }

        <span class="hljs-keyword">public</span> <span class="hljs-title">GlideRotateTransform</span>(Context context, <span class="hljs-keyword">float</span> rotateAngle) {
            <span class="hljs-keyword">super</span>(context);
            <span class="hljs-keyword">this</span>.rotateAngle = rotateAngle;
        }

        <span class="hljs-annotation">@Override</span>
        <span class="hljs-keyword">protected</span> Bitmap <span class="hljs-title">transform</span>(BitmapPool pool, Bitmap toTransform, <span class="hljs-keyword">int</span> outWidth, <span class="hljs-keyword">int</span> outHeight) {
            Matrix matrix=<span class="hljs-keyword">new</span> Matrix();
            matrix.postRotate(rotateAngle);
            <span class="hljs-keyword">return</span> Bitmap.createBitmap(toTransform,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,toTransform.getWidth(),toTransform.getHeight(),matrix,<span class="hljs-keyword">true</span>);
        }
        <span class="hljs-annotation">@Override</span>
        <span class="hljs-keyword">public</span> String <span class="hljs-title">getId</span>() {
            <span class="hljs-keyword">return</span> getClass().getName() + rotateAngle;
        }
    }
        Glide.with(context).load(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/51.jpg"</span>).centerCrop().transform(<span class="hljs-keyword">new</span> GlideRotateTransform(<span class="hljs-keyword">this</span>)).animate(animator).into(imageView);
</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li></ul></pre>

<p>看到这就明白了,其实自定义转换也很简单。需要注意的一点transform()如果多次调用,后面的效果会覆盖前面的,也就是说我们只能看到最后一次的转换,所以不要多次调用,还有centerCrop() 和fitCenter() 也是转换,他是Glide自己实现的转换。 <br>
通过前面几句的描述,你可能会问既然transform()或者centerCrop() 和fitCenter() 不能多次调用,那么我们想实现多种效果该怎么办呢?不要惊慌,我们看下transform源码它就收任意长的参数   </p>



<pre class="prettyprint" name="code"><code class="hljs cs has-numbering"> <span class="hljs-keyword">public</span> DrawableRequestBuilder&lt;ModelType&gt; <span class="hljs-title">transform</span>(BitmapTransformation... transformations) {
        <span class="hljs-keyword">return</span> bitmapTransform(transformations);
    }</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul></pre>

<p>现在我们要实现上面两个圆角加旋转的转换只需要将两个对象都以参数传递就可以了</p>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">        Glide<span class="hljs-preprocessor">.with</span>(context)<span class="hljs-preprocessor">.load</span>(<span class="hljs-string">"http://img2.3lian.com/2014/f6/173/d/51.jpg"</span>)<span class="hljs-preprocessor">.centerCrop</span>()<span class="hljs-preprocessor">.transform</span>(new GlideRoundTransform(this,<span class="hljs-number">50</span>),new GlideRotateTransform(this))<span class="hljs-preprocessor">.animate</span>(animator)<span class="hljs-preprocessor">.into</span>(imageView)<span class="hljs-comment">;</span>
</code><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul></pre>

<p>实现效果 <br>
<img src="https://img-blog.csdn.net/20160829171435629" alt="这里写图片描述" title=""></p>



<h2 id="notifications加载网络图片"><a name="t24"></a>Notifications加载网络图片</h2>

<p>我们发现现在很多App通知都会有一个图片展示,这更美观而且更能形象的表达出通知的内容,那么怎么加载网络上的图片到通知栏呢?Glide提供了NotificationTarget来加载网络上的图片,当然我们自己写通知加载网络上的图片也能实现,但是毕竟需要耗很多时间, <br>
接下来我们先布局通知UI,如下</p>



<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-pi">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-title">LinearLayout</span> <span class="hljs-attribute">xmlns:android</span>=<span class="hljs-value">"http://schemas.android.com/apk/res/android"</span>
    <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"match_parent"</span>
    <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>
    <span class="hljs-attribute">android:background</span>=<span class="hljs-value">"@android:color/white"</span>
    <span class="hljs-attribute">android:orientation</span>=<span class="hljs-value">"vertical"</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-title">LinearLayout
</span>        <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"match_parent"</span>
        <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>
        <span class="hljs-attribute">android:orientation</span>=<span class="hljs-value">"horizontal"</span>
        <span class="hljs-attribute">android:padding</span>=<span class="hljs-value">"2dp"</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-title">ImageView
</span>            <span class="hljs-attribute">android:id</span>=<span class="hljs-value">"@+id/notification_icon"</span>
            <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"50dp"</span>
            <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"50dp"</span>
            <span class="hljs-attribute">android:layout_marginRight</span>=<span class="hljs-value">"2dp"</span>
            <span class="hljs-attribute">android:layout_weight</span>=<span class="hljs-value">"0"</span>
            <span class="hljs-attribute">android:scaleType</span>=<span class="hljs-value">"centerCrop"</span> /&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-title">TextView
</span>            <span class="hljs-attribute">android:layout_gravity</span>=<span class="hljs-value">"center"</span>
            <span class="hljs-attribute">android:id</span>=<span class="hljs-value">"@+id/notification_text"</span>
            <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"0dp"</span>
            <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>
            <span class="hljs-attribute">android:layout_weight</span>=<span class="hljs-value">"1"</span>
            <span class="hljs-attribute">android:ellipsize</span>=<span class="hljs-value">"end"</span>
            <span class="hljs-attribute">android:singleLine</span>=<span class="hljs-value">"true"</span>
            <span class="hljs-attribute">android:textSize</span>=<span class="hljs-value">"12sp"</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-title">LinearLayout</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-title">LinearLayout</span>&gt;</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li></ul></pre>

<p>创建自定义通知</p>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">  <span class="hljs-comment">/**
     * 设置通知栏网络图标
     */</span>
    private void notificationTarget() {
        RemoteViews remoteViews = new RemoteViews(this<span class="hljs-preprocessor">.getPackageName</span>(), R<span class="hljs-preprocessor">.layout</span><span class="hljs-preprocessor">.notifition</span>)<span class="hljs-comment">;</span>
        remoteViews<span class="hljs-preprocessor">.setImageViewResource</span>(R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.notification</span>_icon, R<span class="hljs-preprocessor">.mipmap</span><span class="hljs-preprocessor">.ic</span>_launcher)<span class="hljs-comment">;</span>
        remoteViews<span class="hljs-preprocessor">.setTextViewText</span>(R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.notification</span>_text, <span class="hljs-string">"HeadLine"</span>)<span class="hljs-comment">;</span>

        //build notifition
        NotificationCompat<span class="hljs-preprocessor">.Builder</span> builder = (NotificationCompat<span class="hljs-preprocessor">.Builder</span>) new NotificationCompat<span class="hljs-preprocessor">.Builder</span>(this)
                <span class="hljs-preprocessor">.setSmallIcon</span>(R<span class="hljs-preprocessor">.mipmap</span><span class="hljs-preprocessor">.ic</span>_launcher)
                <span class="hljs-preprocessor">.setContentTitle</span>(<span class="hljs-string">"Content Title"</span>)
                <span class="hljs-preprocessor">.setContentText</span>(<span class="hljs-string">"Content Text"</span>)
                <span class="hljs-preprocessor">.setContent</span>(remoteViews)
                <span class="hljs-preprocessor">.setPriority</span>(NotificationCompat<span class="hljs-preprocessor">.PRIORITY</span>_MIN)<span class="hljs-comment">;</span>
        final Notification notification=builder<span class="hljs-preprocessor">.build</span>()<span class="hljs-comment">;</span>
        if (Build<span class="hljs-preprocessor">.VERSION</span><span class="hljs-preprocessor">.SDK</span>_INT&gt;=<span class="hljs-number">16</span>){
            notification<span class="hljs-preprocessor">.bigContentView</span>=remoteViews<span class="hljs-comment">;</span>
        }
        NotificationManager notificationManager=(NotificationManager)this<span class="hljs-preprocessor">.getSystemService</span>(Context<span class="hljs-preprocessor">.NOTIFICATION</span>_SERVICE)<span class="hljs-comment">;</span>
        notificationManager<span class="hljs-preprocessor">.notify</span>(NOTIFICATION_ID,notification)<span class="hljs-comment">;</span>

        NotificationTarget notificationTarget=new NotificationTarget(this,remoteViews,R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.notification</span>_icon,notification,NOTIFICATION_ID)<span class="hljs-comment">;</span>
        Glide<span class="hljs-preprocessor">.with</span>(this)<span class="hljs-preprocessor">.load</span>(urls[<span class="hljs-number">4</span>])<span class="hljs-preprocessor">.asBitmap</span>()<span class="hljs-preprocessor">.placeholder</span>(R<span class="hljs-preprocessor">.mipmap</span><span class="hljs-preprocessor">.ic</span>_launcher)<span class="hljs-preprocessor">.error</span>(R<span class="hljs-preprocessor">.mipmap</span><span class="hljs-preprocessor">.place</span>)<span class="hljs-preprocessor">.listener</span>(new RequestListener&lt;String, Bitmap&gt;() {
            @Override
            public boolean onException(Exception e, String model, Target&lt;Bitmap&gt; target, boolean isFirstResource) {
                Log<span class="hljs-preprocessor">.e</span>(<span class="hljs-string">"TAG"</span>,e<span class="hljs-preprocessor">.toString</span>())<span class="hljs-comment">;</span>
                return true<span class="hljs-comment">;</span>
            }

            @Override
            public boolean onResourceReady(Bitmap resource, String model, Target&lt;Bitmap&gt; target, boolean isFromMemoryCache, boolean isFirstResource) {
                Log<span class="hljs-preprocessor">.e</span>(<span class="hljs-string">"TAG"</span>,<span class="hljs-string">"1111111111111111111"</span>)<span class="hljs-comment">;</span>
                return false<span class="hljs-comment">;</span>
            }
        }) <span class="hljs-preprocessor">.dontAnimate</span>()<span class="hljs-preprocessor">.into</span>(notificationTarget)<span class="hljs-comment">;</span>

    }</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li></ul></pre>



<h2 id="自定义glidemodule"><a name="t25"></a>自定义GlideModule</h2>

<p>我们先新建一个类实现GlideModule接口 ,在applyOptions方法里利用GlideBuilder 全局改变 Glide 行为的一个方式,通过全局GlideModule 配置Glide,用GlideBuilder设置选项,用Glide注册ModelLoader等</p>



<pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-javadoc">/**
 * Created by xiehui on 2016/8/29.
 */</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ConfigurationGlide</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">GlideModule</span> {</span>
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">applyOptions</span>(<span class="hljs-keyword">final</span> Context context, GlideBuilder builder) {
    <span class="hljs-comment">//配置</span>
    }

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">registerComponents</span>(Context context, Glide glide) {
    }
}
</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul></pre>

<p>完成自定义类的创建后,需要在清单文件中配置,如果不配置的话,我们自定义的ConfigurationGlide 里实现的内容都不会生效。</p>



<pre class="prettyprint" name="code"><code class="hljs cs has-numbering">    &lt;meta-data android:name=<span class="hljs-string">"com.example.xh.glidedemo.ConfigurationGlide"</span>
        android:<span class="hljs-keyword">value</span>=<span class="hljs-string">"GlideModule"</span>/&gt;</code><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul></pre>



<h3 id="混淆"><a name="t26"></a>混淆</h3>

<p>因为要用到反射的GlideModule可以通过反射实例化</p>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">-keepnames class <span class="hljs-keyword">com</span><span class="hljs-preprocessor">.example</span><span class="hljs-preprocessor">.xh</span><span class="hljs-preprocessor">.glidedemo</span><span class="hljs-preprocessor">.ConfigurationGlide</span></code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>

<p>当然我们最好的方法是一次性混淆配置</p>



<pre class="prettyprint" name="code"><code class="hljs java has-numbering">-keep <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> * <span class="hljs-keyword">implements</span> <span class="hljs-title">com</span>.<span class="hljs-title">bumptech</span>.<span class="hljs-title">glide</span>.<span class="hljs-title">module</span>.<span class="hljs-title">GlideModule</span></span></code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>



<h3 id="glide-的图片质量"><a name="t27"></a>Glide 的图片质量</h3>

<p>在 Android 中有两个主要的方法对图片进行解码:ARGB8888(每像素4字节存储) 和 RGB565(每像素2字节存储)。当然ARGB8888有更高的图片质量,Glide默认使用RGB565进行解码,所以内存占用相对较小,如果我们想要更高的图片质量,可以设置,如下</p>



<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">builder<span class="hljs-preprocessor">.setDecodeFormat</span>(DecodeFormat<span class="hljs-preprocessor">.PREFER</span>_ARGB_8888)<span class="hljs-comment">;</span></code><ul class="pre-numbering" style=""><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li></ul></pre>



<h3 id="内存缓存"><a name="t28"></a>内存缓存</h3>

<p>Glide提供了一个类MemorySizeCalculator,用于决定内存缓存大小以及 bitmap 的缓存池。bitmap 池维护了你 App 的堆中的图像分配。正确的 bitmpa 池是非常必要的,因为它避免很多的图像重复回收,这样可以确保垃圾回收器的管理更加合理。它的默认计算实现</p>



<pre class="prettyprint" name="code"><code class="hljs cs has-numbering">        <span class="hljs-comment">//内存缓存</span>
        MemorySizeCalculator memorySizeCalculator = <span class="hljs-keyword">new</span> MemorySizeCalculator(context);
        <span class="hljs-keyword">int</span> defaultMemoryCacheSize = memorySizeCalculator.getMemoryCacheSize();
        <span class="hljs-keyword">int</span> defalutBitmapPoolSize = memorySizeCalculator.getBitmapPoolSize();</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li></ul></pre>

<p>此时我们可以根据默认的大小去调整自己想要的大小</p>



<pre class="prettyprint" name="code"><code class="hljs cs has-numbering">        builder.setMemoryCache(<span class="hljs-keyword">new</span> LruResourceCache((<span class="hljs-keyword">int</span>) (defalutBitmapPoolSize * <span class="hljs-number">1.2</span>)));<span class="hljs-comment">//内部</span>
        builder.setBitmapPool(<span class="hljs-keyword">new</span> LruBitmapPool((<span class="hljs-keyword">int</span>) (defalutBitmapPoolSize * <span class="hljs-number">1.2</span>)));</code><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li></ul></pre>



<h3 id="磁盘缓存"><a name="t29"></a>磁盘缓存</h3>

<p>Glide图片缓存有两种情况,一种是内部磁盘缓存另一种是外部磁盘缓存。我们可以通过 builder.setDiskCache()设置,并且Glide已经封装好了两个类实现外部和内部磁盘缓存,分别是InternalCacheDiskCacheFactory和ExternalCacheDiskCacheFactory,通过源码发现磁盘缓存默认是250M,路径名image_manager_disk_cache如下</p>



<pre class="prettyprint" name="code"><code class="hljs java has-numbering">        <span class="hljs-comment">//DiskCache接口内部Factory接口声明</span>

        <span class="hljs-javadoc">/** 250 MB of cache. */</span>
        <span class="hljs-keyword">int</span> DEFAULT_DISK_CACHE_SIZE = <span class="hljs-number">250</span> * <span class="hljs-number">1024</span> * <span class="hljs-number">1024</span>;
        String DEFAULT_DISK_CACHE_DIR = <span class="hljs-string">"image_manager_disk_cache"</span>;</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul></pre>

<p>设置磁盘缓存大小100M</p>



<pre class="prettyprint" name="code"><code class="hljs cs has-numbering"> <span class="hljs-comment">//磁盘缓存100M</span>
        builder.setDiskCache(<span class="hljs-keyword">new</span> InternalCacheDiskCacheFactory(context, <span class="hljs-number">1024</span> * <span class="hljs-number">1024</span> * <span class="hljs-number">100</span>));<span class="hljs-comment">//内部磁盘缓存</span>
        builder.setDiskCache(<span class="hljs-keyword">new</span> ExternalCacheDiskCacheFactory(context, <span class="hljs-number">100</span> * <span class="hljs-number">1024</span> * <span class="hljs-number">1024</span>));<span class="hljs-comment">//磁盘缓存到外部存储</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li></ul></pre>

<p>上面我们实现了自定义缓存的大小,但是缓存的路径是固定的,那么该如何自己定义缓存路径呢?上代码</p>



<pre class="prettyprint" name="code"><code class="hljs cs has-numbering"><span class="hljs-comment">//指定缓存目录1</span>
        String downLoadPath = Environment.getDownloadCacheDirectory().getPath();
        builder.setDiskCache(<span class="hljs-keyword">new</span> DiskLruCacheFactory(downLoadPath, defaultMemoryCacheSize));
        <span class="hljs-comment">//指定缓存目录2</span>
        builder.setDiskCache(<span class="hljs-keyword">new</span> DiskCache.Factory() {
            @Override
            <span class="hljs-keyword">public</span> DiskCache <span class="hljs-title">build</span>() {
                File cacheLocation = <span class="hljs-keyword">new</span> File(context.getExternalCacheDir(), <span class="hljs-string">"cache_dir"</span>);
                cacheLocation.mkdirs();

                <span class="hljs-keyword">return</span> DiskLruCacheWrapper.<span class="hljs-keyword">get</span>(cacheLocation, <span class="hljs-number">1024</span> * <span class="hljs-number">1024</span> * <span class="hljs-number">100</span>);
            }
        });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul></pre>

<p>registerComponents里的实现参考<a href="https://github.com/xiehui999/GlideDemo">源码</a></p>

<p>本文是自己学习的一个总结记录,同时也希望对看本文的你有一定帮助,由于水平有限,文中若有错误的地方欢迎指正!谢谢。</p></div>
        <script type="text/javascript">
            $(function () {
                $('pre.prettyprint code').each(function () {
                    var lines = $(this).text().split('\n').length;
                    var $numbering = $('<ul></ul>').addClass('pre-numbering').hide();
                    $(this).addClass('has-numbering').parent().append($numbering);
                    for (i = 1; i <= lines; i++) {
                        $numbering.append($('<li></li>').text(i));
                    };
                    $numbering.fadeIn(1700);
                });
            });
        </script>
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值