Glide(图片异步加载缓存库)的方法介绍

文章来源:http://blog.csdn.net/u011733020/article/details/52319283 

Glide 在开源中国上的介绍

  • Glide 的详细介绍:请点这里
  • Glide 的下载地址:请点这里
Glide(图片异步加载缓存库)的方法介绍_第1张图片

Glide :
An image loading and caching library for Android focused on smooth scrolling
安卓上专注于平滑滑动的图片加载和缓存库。

Glide有以下特点:

1.注重 list中的图片在scroll状态下的流畅性。
2.可以展示视频图像,普通格式图片和GIF格式。
3.默认网络请求使用的是httpurlconnection,同时支持自定义使用volley 或者 ok。
4.自定义多个请求的优先级,重要的图片,可以设置高的优先级,优先加载。
5.可以给url 设置一个签名,当url 指向不变,图片内容变化时,根据签名不同,去自动更换以缓存的图片,这一点是imagoader无法做到的。
6.更有一个非常优秀的特点,可以在非ImageView 类型上面加载图片。
7.Glide 对内存的使用非常优秀,并且Glide生命周期与Activity生命周期绑定,更好的分配回收内存。
。。。
更多优点,不一一总结,留待大家亲身使用感受。


获取Glide

首先获取Glide的jar包,可以去github下载,添加依赖,也可以使用gradle 下载。

You can download a jar from GitHub's releases page.

Or use Gradle:

repositories {
  mavenCentral() // jcenter() works as well because it pulls from Maven Central
}

dependencies {
  compile 'com.github.bumptech.glide:glide:3.7.0'
  compile 'com.android.support:support-v4:19.1.0'
}

How do I use Glide?

// For a simple view:
@Override public void onCreate(Bundle savedInstanceState) {
  ...
  ImageView imageView = (ImageView) findViewById(R.id.my_image_view);

  Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView);
}

// For a simple image list:
@Override public View getView(int position, View recycled, ViewGroup container) {
  final ImageView myImageView;
  if (recycled == null) {
    myImageView = (ImageView) inflater.inflate(R.layout.my_image_view, container, false);
  } else {
    myImageView = (ImageView) recycled;
  }

  String url = myUrls.get(position);

  Glide
    .with(myFragment)
    .load(url)
    .centerCrop()
    .placeholder(R.drawable.loading_spinner)
    .crossFade()
    .into(myImageView);

  return myImageView;
}

可以看出Glide 的使用时相当简便的,添加依赖后,仅仅通过Glide.with().load().into();就可以展示远程图片。
以上便是Github上关于Glide的基本介绍,接下来我们看具体的使用。

Glide 使用起来非常简单,Glide 在Activity 、Fragment 中都可以使用,并且是通过绑定对应的对象去使用。

[java]  view plain  copy
 print ?
  1. Glide.with(this).load(url).into(imageView);  
这就是最基本的使用方式 。
Glide(图片异步加载缓存库)的方法介绍_第2张图片
with() :使Glide 的生命周期与当前对象绑定,可以是Activity Fragment Context等等。
load():可以加载一个本地图片,或者网络图片地址,也可以是Android工程的 内部Resource 图片资源。
into():将展示在ImageView 对象。

介绍一些常用的配置:

Glide基本方法:Glide.with(this).load(R.mipmap.bigger).into(imageView);
加载网络图片时显示的占位图: .placeholder(holderId).into(imageView);
加载失败时展示的失败图: .error(errorId).into(imageView);
淡入淡出的渐变展示过渡动画:.crossFade().into(imageView);淡入淡出的渐变展示过渡动画 crossFade(int millSeconds) 默认Glide是自动执行该方法的,淡入时间是300ms (可以自己传int 参数去调整时间),如果要禁止该效果,可以调用dontAnimate() 方法
按比例缩小或者放大到ImageView宽度,居中显示: .fitCenter().into(imageView);
按比例放大图片居中显示,图片的长/宽 可能大于ImageView的长/宽: .centerCrop().into(imageView);

priority( Priority.HIGH ):设置请求的优先级 由低到高分别为: Priority.LOW、  Priority.NORMAL、  Priority.HIGH   、 Priority.IMMEDIATE。

skipMemoryCache( true ) :是否设置不允许内存缓存,如果是比较频繁的变化,那么可以不在内存中保存,默认是false,即允许内存缓存。

diskCacheStrategy():设置磁盘缓存策略,因为默认情况下 Glide 不仅仅会缓存远程图片,并且会缓存适应当前View size的图片。
参数为枚举类型 有四种分辨是:
DiskCacheStrategy.NONE 什么都不缓存。
DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像。
DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即,降低分辨率后的(或者是转换后的)。
DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为)。

override(int w,int h): 重新调整图片的大小。Glide 加载图片默认是适应ImageView的大小,调用该方法,可能导致图片显示小于ImageView的size。

缩略图:普通方式 .thumbnail(0.1f) 将原图缩小到10%。使用该方法需要保证ImageView的ScaleType。
高级方式通过请求一个额外的Request去请求缩略图
[java]  view plain  copy
 print ?
  1. private void loadImageThumbnailRequest() {    
  2.     // setup Glide request without the into() method  
  3.     DrawableRequestBuilder thumbnailRequest = Glide  
  4.         .with( context )  
  5.         .load( thumbnailUrl );  
  6.   
  7.     // pass the request as a a parameter to the thumbnail request  
  8.     Glide  
  9.         .with( context )  
  10.         .load( UsageExampleGifAndVideos.gifUrl )  
  11.         .thumbnail( thumbnailRequest )  
  12.         .into( imageView);  
  13. }  

将图片显示在普通View上:
[java]  view plain  copy
 print ?
  1. public  void showImageOnCustomView(T t, String url, View view) {  
  2.     ViewTarget viewTarget = new ViewTarget(view) {  
  3.         @Override  
  4.         public void onResourceReady(GlideDrawable resource, GlideAnimationsuper GlideDrawable> glideAnimation) {  
  5.             //>=API 16 this.view.setBackground(resource.getCurrent());  
  6.             this.view.setBackgroundDrawable(resource.getCurrent());  
  7.         }  
  8.     };  
  9.     Glide.with(context).load(url).into(viewTarget);  
  10.       
  11. }  

属性动画animate(): 给图片添加动画,比如属性动画 translate、scale、alpha、rotate,又或者 Activity切换样式 这种属性动画 android.R.anim.slide_in_left

[java]  view plain  copy
 print ?
  1. Glide    
  2.     .with( context )  
  3.     .load( url )  
  4.     .animate( android.R.anim.slide_in_left ) // or R.anim.zoom_in  
  5.     .into( imageView1 );  
也可以自定义xml Animation。
或者:
[java]  view plain  copy
 print ?
  1. ViewPropertyAnimation.Animator animationObject = new ViewPropertyAnimation.Animator() {    
  2.     @Override  
  3.     public void animate(View view) {  
  4.         // if it's a custom view class, cast it here  
  5.         // then find subviews and do the animations  
  6.         // here, we just use the entire view for the fade animation  
  7.         view.setAlpha( 0f );  
  8.   
  9.         ObjectAnimator fadeAnim = ObjectAnimator.ofFloat( view, "alpha", 0f, 1f );  
  10.         fadeAnim.setDuration( 2500 );  
  11.         fadeAnim.start();  
  12.     }  
  13. };  
  14.   
  15. Glide    
  16.     .with( context )  
  17.     .load( url )  
  18.     .animate( animationObject )  
  19.     .into( imageView );  
  
图片进行转换transform() /bitmapTransform(): 比如模糊,圆形图片 and so on。

[java]  view plain  copy
 print ?
  1. public class BlurTransformation extends BitmapTransformation {  
  2.   
  3.     private RenderScript rs;  
  4.   
  5.     public BlurTransformation(Context context) {  
  6.         super( context );  
  7.   
  8.         rs = RenderScript.create( context );  
  9.     }  
  10.   
  11.     @Override  
  12.     protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {  
  13.         Bitmap blurredBitmap = toTransform.copy( Bitmap.Config.ARGB_8888, true );  
  14.   
  15.         // Allocate memory for Renderscript to work with  
  16.         Allocation input = Allocation.createFromBitmap(  
  17.             rs,   
  18.             blurredBitmap,   
  19.             Allocation.MipmapControl.MIPMAP_FULL,   
  20.             Allocation.USAGE_SHARED  
  21.         );  
  22.         Allocation output = Allocation.createTyped(rs, input.getType());  
  23.   
  24.         // Load up an instance of the specific script that we want to use.  
  25.         ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));  
  26.         script.setInput(input);  
  27.   
  28.         // Set the blur radius  
  29.         script.setRadius(10);  
  30.   
  31.         // Start the ScriptIntrinisicBlur  
  32.         script.forEach(output);  
  33.   
  34.         // Copy the output to the blurred bitmap  
  35.         output.copyTo(blurredBitmap);  
  36.   
  37.         toTransform.recycle();  
  38.   
  39.         return blurredBitmap;  
  40.     }  
  41.   
  42.     @Override  
  43.     public String getId() {  
  44.         return "blur";  
  45.     }  
  46. }  
  47.   
  48.   
  49.   
  50.   
  51. Glide    
  52.     .with( context )  
  53.     .load( url )  
  54.     .transform( new BlurTransformation( context ) )  
  55.     //.bitmapTransform( new BlurTransformation( context ) ) // this would work too!  
  56.     .into( imageView);  

自定义Glide组件GlideModule 配置
[java]  view plain  copy
 print ?
  1. /** 
  2.  * Instruction :设置 MemoryCache BitmapPool  DiskCache size  or path&size 
  3.  * Created by zhangjun on 2016-8-19 17:24 
  4.  */  
  5. public class CustomCachingGlideModule implements GlideModule {  
  6.     @Override  
  7.     public void applyOptions(Context context, GlideBuilder builder) {  
  8.         MemorySizeCalculator calculator = new MemorySizeCalculator(context);  
  9.         int defaultMemoryCacheSize = calculator.getMemoryCacheSize();  
  10.         int defaultBitmapPoolSize = calculator.getBitmapPoolSize();  
  11.   
  12.         int customMemoryCacheSize = (int) (2 * defaultMemoryCacheSize);  
  13.         int customBitmapPoolSize = (int) (2 * defaultBitmapPoolSize);  
  14.   
  15.         builder.setMemoryCache(new LruResourceCache(customMemoryCacheSize));  
  16.         builder.setBitmapPool(new LruBitmapPool( customBitmapPoolSize) );  
  17.   
  18.         int cacheSize100MegaBytes = 104857600;  
  19.         Log.e("CustomCachingGlide","32");  
  20. //      builder.setDiskCache(  
  21.                 // 内部  
  22. //              new InternalCacheDiskCacheFactory(context, cacheSize100MegaBytes)  
  23.                 //外部  
  24. //              new ExternalCacheDiskCacheFactory(context,cacheSize100MegaBytes)  
  25. //      );  
  26.   
  27.         //builder.setDiskCache(alCacheDiskCacheFactory(context, cacheSize100MegaBytes));  
  28.         //new Extern  
  29.   
  30.         // or any other path  
  31. //      String downloadDirectoryPath = Environment.getDownloadCacheDirectory().getPath();  
  32. //      String downloadDirectoryPath= Environment.getExternalStorageDirectory().getPath();  
  33.         String downloadDirectoryPath=ApplicationData.getPicDir();  
  34.         Log.e("CustomCachingGlideModule",""+downloadDirectoryPath);  
  35.         Log.e("CustomCachingGlide","downloadDirectoryPat="+downloadDirectoryPath);  
  36.         builder.setDiskCache(  
  37.                 new DiskLruCacheFactory( downloadDirectoryPath, cacheSize100MegaBytes) );  
  38.     }  
  39.   
  40.   
  41.   
  42.   
  43.     @Override  
  44.     public void registerComponents(Context context, Glide glide) {  
  45.   
  46.     }  
  47. }  
  48.   
  49. 在清单文件中:  
  50.    
  51.             android:name="packageName.CustomCachingGlideModule"  
  52.             android:value="GlideModule" />  

设置网络请求库:
Glide 默认用HttpUrlConnetction去请求网络,默认提供几张请求方式 分别是Volley 和OKHttp
使用方式:
Volley在build.gradle:
[java]  view plain  copy
 print ?
  1. dependencies {    
  2.     // your other dependencies  
  3.     // ...  
  4.   
  5.     // Glide  
  6.     compile 'com.github.bumptech.glide:glide:3.7.0'  
  7.   
  8.     // Glide's Volley Integration   
  9.     compile 'com.github.bumptech.glide:volley-integration:1.4.0@aar'  
  10.     compile 'com.mcxiaoke.volley:library:1.0.8'  
  11. }  

OK 在build.gradle:
[java]  view plain  copy
 print ?
  1. dependencies {    
  2.     // your other dependencies  
  3.     // ...  
  4.   
  5.     // Glide  
  6.     compile 'com.github.bumptech.glide:glide:3.7.0'  
  7.   
  8.     // Glide's OkHttp3 Integration   
  9.     compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'  
  10.     compile 'com.squareup.okhttp3:okhttp:3.2.0'  
  11. }  


下面的作为了解
1.Glide请求Https :
通过创建禁止ssl 验证的OKHttpClient来实现
[java]  view plain  copy
 print ?
  1. public class UnsafeOkHttpClient {    
  2.     public static OkHttpClient getUnsafeOkHttpClient() {  
  3.         try {  
  4.             // Create a trust manager that does not validate certificate chains  
  5.             final TrustManager[] trustAllCerts = new TrustManager[]{  
  6.                     new X509TrustManager() {  
  7.                         @Override  
  8.                         public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {  
  9.                         }  
  10.   
  11.                         @Override  
  12.                         public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {  
  13.                         }  
  14.   
  15.                         @Override  
  16.                         public java.security.cert.X509Certificate[] getAcceptedIssuers() {  
  17.                             return null;  
  18.                         }  
  19.                     }  
  20.             };  
  21.   
  22.             // Install the all-trusting trust manager  
  23.             final SSLContext sslContext = SSLContext.getInstance("SSL");  
  24.             sslContext.init(null, trustAllCerts, new java.security.SecureRandom());  
  25.   
  26.             // Create an ssl socket factory with our all-trusting manager  
  27.             final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();  
  28.   
  29.             OkHttpClient okHttpClient = new OkHttpClient();  
  30.             okHttpClient.setSslSocketFactory(sslSocketFactory);  
  31.             okHttpClient.setProtocols(Arrays.asList(Protocol.HTTP_1_1));  
  32.             okHttpClient.setHostnameVerifier(new HostnameVerifier() {  
  33.                 @Override  
  34.                 public boolean verify(String hostname, SSLSession session) {  
  35.                     return true;  
  36.                 }  
  37.             });  
  38.   
  39.             return okHttpClient;  
  40.         } catch (Exception e) {  
  41.             throw new RuntimeException(e);  
  42.         }  
  43.     }  
  44. }  


[java]  view plain  copy
 print ?
  1. public class UnsafeOkHttpGlideModule implements GlideModule {    
  2.         @Override  
  3.         public void applyOptions(Context context, GlideBuilder builder) {  
  4.   
  5.         }  
  6.   
  7.         @Override  
  8.         public void registerComponents(Context context, Glide glide) {  
  9.             glide.register(GlideUrl.class, InputStream.classnew OkHttpUrlLoader.Factory());  
  10.         }  
  11.     }  

[java]  view plain  copy
 print ?
  1. public class OkHttpUrlLoader implements ModelLoader {  
  2.   
  3.     /** 
  4.      * The default factory for {@link OkHttpUrlLoader}s. 
  5.      */  
  6.     public static class Factory implements ModelLoaderFactory {  
  7.         private static volatile OkHttpClient internalClient;  
  8.         private OkHttpClient client;  
  9.   
  10.         private static OkHttpClient getInternalClient() {  
  11.             if (internalClient == null) {  
  12.                 synchronized (Factory.class) {  
  13.                     if (internalClient == null) {  
  14.                         internalClient = UnsafeOkHttpClient.getUnsafeOkHttpClient();  
  15.                     }  
  16.                 }  
  17.             }  
  18.             return internalClient;  
  19.         }  
  20.   
  21.         /** 
  22.          * Constructor for a new Factory that runs requests using a static singleton client. 
  23.          */  
  24.         public Factory() {  
  25.             this(getInternalClient());  
  26.         }  
  27.   
  28.         /** 
  29.          * Constructor for a new Factory that runs requests using given client. 
  30.          */  
  31.         public Factory(OkHttpClient client) {  
  32.             this.client = client;  
  33.         }  
  34.   
  35.         @Override  
  36.         public ModelLoader build(Context context, GenericLoaderFactory factories) {  
  37.             return new OkHttpUrlLoader(client);  
  38.         }  
  39.   
  40.         @Override  
  41.         public void teardown() {  
  42.             // Do nothing, this instance doesn't own the client.  
  43.         }  
  44.     }  
  45.   
  46.     private final OkHttpClient client;  
  47.   
  48.     public OkHttpUrlLoader(OkHttpClient client) {  
  49.         this.client = client;  
  50.     }  
  51.   
  52.     @Override  
  53.     public DataFetcher getResourceFetcher(GlideUrl model, int width, int height) {  
  54.         return new OkHttpStreamFetcher(client, model);  
  55.     }  
  56. }  

[java]  view plain  copy
 print ?
  1. public class OkHttpStreamFetcher implements DataFetcher {    
  2.     private final OkHttpClient client;  
  3.     private final GlideUrl url;  
  4.     private InputStream stream;  
  5.     private ResponseBody responseBody;  
  6.   
  7.     public OkHttpStreamFetcher(OkHttpClient client, GlideUrl url) {  
  8.         this.client = client;  
  9.         this.url = url;  
  10.     }  
  11.   
  12.     @Override  
  13.     public InputStream loadData(Priority priority) throws Exception {  
  14.         Request.Builder requestBuilder = new Request.Builder()  
  15.                 .url(url.toStringUrl());  
  16.   
  17.         for (Map.Entry headerEntry : url.getHeaders().entrySet()) {  
  18.             String key = headerEntry.getKey();  
  19.             requestBuilder.addHeader(key, headerEntry.getValue());  
  20.         }  
  21.   
  22.         Request request = requestBuilder.build();  
  23.   
  24.         Response response = client.newCall(request).execute();  
  25.         responseBody = response.body();  
  26.         if (!response.isSuccessful()) {  
  27.             throw new IOException("Request failed with code: " + response.code());  
  28.         }  
  29.   
  30.         long contentLength = responseBody.contentLength();  
  31.         stream = ContentLengthInputStream.obtain(responseBody.byteStream(), contentLength);  
  32.         return stream;  
  33.     }  
  34.   
  35.     @Override  
  36.     public void cleanup() {  
  37.         if (stream != null) {  
  38.             try {  
  39.                 stream.close();  
  40.             } catch (IOException e) {  
  41.                 // Ignored  
  42.             }  
  43.         }  
  44.         if (responseBody != null) {  
  45.             try {  
  46.                 responseBody.close();  
  47.             } catch (IOException e) {  
  48.                 // Ignored.  
  49.             }  
  50.         }  
  51.     }  
  52.   
  53.     @Override  
  54.     public String getId() {  
  55.         return url.getCacheKey();  
  56.     }  
  57.   
  58.     @Override  
  59.     public void cancel() {  
  60.         // TODO: call cancel on the client when this method is called on a background thread. See #257  
  61.     }  
  62. }  

2.支持自定义请求当前ImageView的分辨率下的图片,比如 服务器提供了多种分辨率,如果你知道当前View的分辨率 w*h 那么可以去请求相同分辨率的服务器图片资源。

你可能感兴趣的:(三方库)