不得不知道的图片加载框架之Glide

wxsf0575 8年前
   <h2>简介</h2>    <p>在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。</p>    <h2>特点</h2>    <p>(1)使用简单</p>    <p>(2)可配置度高,自适应程度高</p>    <p>(3)支持常见图片格式 : Jpg png gif webp</p>    <p>(4)支持多种数据源: 网络、本地、资源、Assets 等</p>    <p>(5)高效缓存策略: 支持Memory和Disk图片缓存,默认Bitmap格式采用RGB_565,内存使用至少减少一半.</p>    <p>(6)生命周期集成: 根据Activity/Fragment生命周期自动管理请求</p>    <p>(7)高效处理Bitmap : 使用Bitmap Pool使Bitmap复用,主动调用recycle回收需要回收的Bitmap,减小系统回收压力.</p>    <h2>功能API介绍:</h2>    <h2>1)简单使用:</h2>    <pre>  <code class="language-java">Glide      .with(this)      .load("http://xxx.com/source/a.png")      .into(imageView);</code></pre>    <h2>2)Glide.with()的使用</h2>    <p>(1)with(Context context). 使用Application上下文,Glide请求将不受Activity/Fragment生命周期控制。</p>    <p>(2)with(Activity activity).使用Activity作为上下文,Glide的请求会受到Activity生命周期控制。</p>    <p>(3)with(FragmentActivity activity).Glide的请求会受到FragmentActivity生命周期控制。</p>    <p>(4)with(android.app.Fragment fragment).Glide的请求会受到Fragment 生命周期控制。</p>    <p>(5)with(android.support.v4.app.Fragment fragment).Glide的请求会受到Fragment生命周期控制。</p>    <h2>3)load()的使用</h2>    <p>Glide基本可以load任何可以拿到的媒体资源</p>    <ul>     <li>SD卡资源:<br> load(“file://”+ Environment.getExternalStorageDirectory().getPath()+”/test.jpg”)</li>     <li>assets资源:<br> load(“file:///android_asset/3.gif”)</li>     <li>raw资源:<br> load(“Android.resource://com.frank.glide/raw/raw_1”)或load(“android.resource://com.frank.glide/raw/”+R.raw.raw_1)</li>     <li>drawable资源:<br> load(“android.resource://com.veyron.glide/drawable/news”)或load(“android.resource://comveyron.glide/drawable/”+R.drawable.news)</li>     <li>ContentProvider资源:<br> load(“content://media/external/images/media/139469”)</li>     <li>http资源:<br> load(“ <a href="https://simg.open-open.com/show/d035d3a5d4b07f34d1c1a14164359867.jpg" rel="nofollow,noindex">http://img.my.csdn.NET/uploads/201508/05/1438760757_3588.jpg</a> “)</li>     <li>https资源:<br> load(“ <a href="/misc/goto?guid=4959735924620050490" rel="nofollow,noindex">https://img.alicdn.com/tps/TB1uyhoMpXXXXcLXVXXXXXXXXXX-476-538.jpg_240x5000q50.jpg_.webp</a> “)</li>    </ul>    <p>此外,load不限于string类型:</p>    <pre>  <code class="language-java">load(Uri uri),load(File file),load(Integer resourceId),load(URL url),load(byte[] model),load(T model),loadFromMediaStore(Uri uri)。</code></pre>    <h2>4)重要功能</h2>    <pre>  <code class="language-java">(1)禁止内存缓存: .skipMemoryCache(true)  (2)清除内存缓存: // 必须在UI线程中调用      Glide.get(context).clearMemory();  (3)禁止磁盘缓存: .diskCacheStrategy(DiskCacheStrategy.NONE)   (4)清除磁盘缓存: // 必须在后台线程中调用,建议同时clearMemory()     Glide.get(applicationContext).clearDiskCache();   (5)获取缓存大小: new GetDiskCacheSizeTask(textView).execute(new File(getCacheDir(), DiskCache.Factory.DEFAULT_DISK_CACHE_DIR));    class GetDiskCacheSizeTask extends AsyncTask<File, Long, Long> {  private final TextView resultView;    public GetDiskCacheSizeTask(TextView resultView) {      this.resultView = resultView;  }    @Override  protected void onPreExecute() {      resultView.setText("Calculating...");  }    @Override  protected void onProgressUpdate(Long... values) { /* onPostExecute(values[values.length - 1]); */ }    @Override  protected Long doInBackground(File... dirs) {      try {          long totalSize = 0;          for (File dir : dirs) {              publishProgress(totalSize);              totalSize += calculateSize(dir);          }          return totalSize;      } catch (RuntimeException ex) {          final String message = String.format("Cannot get size of %s: %s", Arrays.toString(dirs), ex);          new Handler(Looper.getMainLooper()).post(new Runnable() {              @Override              public void run() {                  resultView.setText("error");                  Toast.makeText(resultView.getContext(), message, Toast.LENGTH_LONG).show();              }          });      }      return 0L;  }    @Override  protected void onPostExecute(Long size) {      String sizeText = android.text.format.Formatter.formatFileSize(resultView.getContext(), size);      resultView.setText(sizeText);  }    private static long calculateSize(File dir) {      if (dir == null) return 0;      if (!dir.isDirectory()) return dir.length();      long result = 0;      File[] children = dir.listFiles();      if (children != null)          for (File child : children)              result += calculateSize(child);      return result;  }  }      (6)指定资源的优先加载顺序:  //优先加载      Glide          .with(context)          .load(heroImageUrl)          .priority(Priority.HIGH)          .into(imageViewHero);      //后加载      Glide          .with(context)          .load(itemImageUrl)          .priority(Priority.LOW)          .into(imageViewItem);    (7)先显示缩略图,再显示原图:  //用原图的1/10作为缩略图      Glide          .with(this)          .load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")          .thumbnail(0.1f)          .into(iv_0);        //用其它图片作为缩略图      DrawableRequestBuilder<Integer> thumbnailRequest = Glide          .with(this)          .load(R.drawable.news);        Glide.with(this)          .load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")          .thumbnail(thumbnailRequest)          .into(iv_0);  (8)对图片进行裁剪、模糊、滤镜等处理:具体看demo源码</code></pre>    <h2>5)部分api介绍:</h2>    <p><img src="https://simg.open-open.com/show/f04976fc9fe6c2a9f5fc3b695c75f463.png"></p>    <p><img src="https://simg.open-open.com/show/81195ec3fa681e83de86d230616d5b23.png"></p>    <p>补充:</p>    <pre>  <code class="language-java">CenterCrop   CenterCrop()是一个裁剪技术,即缩放图像让它填充到 ImageView 界限内并且裁剪额外的部分。ImageView 可能会完全填充,但图像可能不会完整显示。  FitCenter   fitCenter() 也是裁剪技术,即缩放图像让图像都测量出来等于或小于 ImageView 的边界范围。该图像将会完全显示,但可能不会填满整个 ImageView。</code></pre>    <h2>使用步骤:</h2>    <p>1)在build.gradle中添加依赖:</p>    <pre>  <code class="language-java">compile 'com.github.bumptech.glide:glide:3.7.0'</code></pre>    <p>2)如果你的项目没有support-v4库,还需要添加support-v4依赖:</p>    <pre>  <code class="language-java">compile 'com.android.support:support-v4:23.3.0'</code></pre>    <p>3)如果使用变换,可以添加一个自定义的变换库</p>    <p>添加依赖:</p>    <pre>  <code class="language-java">compile 'jp.wasabeef:glide-transformations:2.0.1'      // If you want to use the GPU Filters  compile 'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.3.0'</code></pre>    <h2>Demo</h2>    <h3><a href="/misc/goto?guid=4959735924709579287" rel="nofollow,noindex">ExampleForGlide</a></h3>    <p> </p>    <p>来自:http://blog.csdn.net/leaf_130/article/details/54847104</p>    <p> </p>