简介

Glide是 Google推荐的图片加载库,它可以支持来自url,Android资源,文件,Uri中的图片加载,同时还支持gif图片的加载,以及各种图片显示前的bitmap处理(例如:圆角图片,圆形图片,高斯模糊,旋转,灰度等等),缓存处理,请求优先级处理,动画处理,缩略图处理,图片大小自定义等等.可谓是非常的强大.

添加依赖


    1. compile 'com.github.bumptech.glide:glide:3.7.0'



    加载网络图片



    1. public class TestGlideActivity extends Activity {  
    2.     @Override  
    3.     protected void onCreate(Bundle savedInstanceState) {  
    4.         super.onCreate(savedInstanceState);  
    5.         setContentView(R.layout.activity_test);  
    6. url = "http://www.qq745.com/uploads/allimg/141106/1-141106153Q5.png";  
    7. targetView = (ImageView) findViewById(R.id.iv_target);  
    8.         Glide.with(this).  
    9.                 load(url).  
    10.                 asBitmap(). //强制处理为bitmap  
    11.                 into(targetView);//显示到目标View中  
    12.     }  
    13. }


    加载资源图片



      1. public class TestGlideActivity extends Activity {  
      2.     @Override  
      3.     protected void onCreate(Bundle savedInstanceState) {  
      4.         super.onCreate(savedInstanceState);  
      5.         setContentView(R.layout.activity_test);  
      6. resourceId = R.drawable.test;  
      7. targetView = (ImageView) findViewById(R.id.iv_target);  
      8.         Glide.with(this).  
      9.                 load(resourceId).  
      10.                 asBitmap().  
      11.                 into(targetView);  
      12.     }  
      13. }



      加载本地文件图片



        1. public class TestGlideActivity extends Activity {  
        2.     @Override  
        3.     protected void onCreate(Bundle savedInstanceState) {  
        4.         super.onCreate(savedInstanceState);  
        5.         setContentView(R.layout.activity_test);  
        6. file = new File(Environment.getExternalStorageDirectory(), "test.jpg");  
        7. targetView = (ImageView) findViewById(R.id.iv_target);  
        8.         Glide.with(this).  
        9.                 load(file).  
        10.                 asBitmap().  
        11.                 into(targetView);  
        12.     }  
        13. }



        从Uri中加载



          1. public class TestGlideActivity extends Activity {  
          2.     @Override  
          3.     protected void onCreate(Bundle savedInstanceState) {  
          4.         super.onCreate(savedInstanceState);  
          5.         setContentView(R.layout.activity_test);  
          6. uri = Uri.parse("android.resource://" + this.getPackageName() + "/" + R.drawable.test);  
          7. targetView = (ImageView) findViewById(R.id.iv_target);  
          8.         Glide.with(this).  
          9.                 load(uri).  
          10.                 asBitmap().  
          11.                 into(targetView);  
          12.     }  
          13. }



          加载gif图片



            1. public class TestGlideActivity extends Activity {  
            2.     @Override  
            3.     protected void onCreate(Bundle savedInstanceState) {  
            4.         super.onCreate(savedInstanceState);  
            5.         setContentView(R.layout.activity_test);  
            6. targetView = (ImageView) findViewById(R.id.iv_target);  
            7.         Glide.with(this).  
            8.                 load(R.drawable.smail).  
            9.                 asGif().//注意:这里显示的指明了要加载的是gif图片,当然即使不指明,glide也会自己判断.  
            10.                 into(targetView);  
            11.     }  
            12. }



            设置默认图片和加载失败时显示的图片



              1. public class TestGlideActivity extends Activity {  
              2.     @Override  
              3.     protected void onCreate(Bundle savedInstanceState) {  
              4.         super.onCreate(savedInstanceState);  
              5.         setContentView(R.layout.activity_test);  
              6. targetView = (ImageView) findViewById(R.id.iv_target);  
              7.         Glide.with(this).  
              8.                 load(R.drawable.test).  
              9.                 asBitmap().  
              10.                 placeholder(R.drawable.bg_loading).//加载中显示的图片  
              11.                 error(R.drawable.bg_error).//加载失败时显示的图片  
              12.                 into(targetView);  
              13.     }  
              14. }



              淡入显示效果



                1. public class TestGlideActivity extends Activity {  
                2.     @Override  
                3.     protected void onCreate(Bundle savedInstanceState) {  
                4.         super.onCreate(savedInstanceState);  
                5.         setContentView(R.layout.activity_test);  
                6. targetView = (ImageView) findViewById(R.id.iv_target);  
                7.         Glide.with(this).  
                8.                 load(R.drawable.test).  
                9.                 placeholder(R.drawable.bg_loading).//加载中显示的图片  
                10.                 error(R.drawable.bg_error).//加载失败时显示的图片  
                11.                 crossFade().//淡入显示,注意:如果设置了这个,则必须要去掉asBitmap  
                12.                 into(targetView);  
                13.     }  
                14. }



                另外,crossFade还可以接收一个参数来设置淡入显示效果的持续时间,crossFade(int duration); 


                如果你想直接显示图片,而不是淡入显示图片,则可以通过dontAnimate()方法设置.







                调整图片像素大小




                1. public class TestGlideActivity extends Activity {  
                2.     @Override  
                3.     protected void onCreate(Bundle savedInstanceState) {  
                4.         super.onCreate(savedInstanceState);  
                5.         setContentView(R.layout.activity_test);  
                6. targetView = (ImageView) findViewById(R.id.iv_target);  
                7.         Glide.with(this).  
                8.                 load(R.drawable.test).  
                9.                 placeholder(R.drawable.bg_loading).//加载中显示的图片  
                10.                 error(R.drawable.bg_error).//加载失败时显示的图片  
                11.                 crossFade(1000).//淡入显示的时间,注意:如果设置了这个,则必须要去掉asBitmap  
                12.                 override(80,80).//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高  
                13.                 into(targetView);  
                14.     }  
                15. }


                设置CenterCrop,FitCenter


                CenterCrop,FitCenter都是对目标图片进行裁剪,了解过ImageView的ScaleType属性就知道,这2种裁剪方式在ImageView上也是有的,分别对应ImageView的ImageView.ScaleType.CENTER_CROP和mageView.ScaleType.FIT_CENTER的.


                1. public class TestGlideActivity extends Activity {  
                2.     @Override  
                3.     protected void onCreate(Bundle savedInstanceState) {  
                4.         super.onCreate(savedInstanceState);  
                5.         setContentView(R.layout.activity_test);  
                6. targetView = (ImageView) findViewById(R.id.iv_target);  
                7.         targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);  
                8.         Glide.with(this).  
                9.                 load(R.drawable.test).  
                10.                 placeholder(R.drawable.bg_loading).//加载中显示的图片  
                11.                 error(R.drawable.bg_error).//加载失败时显示的图片  
                12.                 crossFade(1000).//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap  
                13.                 override(80,80).//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高  
                14.                 centerCrop().//中心裁剪,缩放填充至整个ImageView  
                15.                 into(targetView);  
                16.     }  
                17. }


                缓存策略设置



                内存缓存设置,通过skipMemoryCache(boolean)来设置是否需要缓存到内存,默认是会缓存到内存的.



                1. public class TestGlideActivity extends Activity {  
                2.     @Override  
                3.     protected void onCreate(Bundle savedInstanceState) {  
                4.         super.onCreate(savedInstanceState);  
                5.         setContentView(R.layout.activity_test);  
                6. targetView = (ImageView) findViewById(R.id.iv_target);  
                7.         targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);  
                8.         Glide.with(this).  
                9.                 load(R.drawable.test).  
                10.                 placeholder(R.drawable.bg_loading).//加载中显示的图片  
                11.                 error(R.drawable.bg_error).//加载失败时显示的图片  
                12.                 crossFade(1000).//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap  
                13.                 override(80,80).//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高  
                14.                 centerCrop().//中心裁剪,缩放填充至整个ImageView  
                15.                 skipMemoryCache(true).//跳过内存缓存  
                16.                 into(targetView);  
                17.     }  
                18. }


                磁盘缓存,磁盘缓存通过diskCacheStrategy(DiskCacheStrategy)来设置,DiskCacheStrategy一共有4种模式:

                DiskCacheStrategy.NONE:什么都不缓存 
                DiskCacheStrategy.SOURCE:仅缓存原图(全分辨率的图片) 
                DiskCacheStrategy.RESULT:仅缓存最终的图片,即修改了尺寸或者转换后的图片 
                DiskCacheStrategy.ALL:缓存所有版本的图片,默认模式




                1. public class TestGlideActivity extends Activity {  
                2.     @Override  
                3.     protected void onCreate(Bundle savedInstanceState) {  
                4.         super.onCreate(savedInstanceState);  
                5.         setContentView(R.layout.activity_test);  
                6. targetView = (ImageView) findViewById(R.id.iv_target);  
                7.         targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);  
                8.         Glide.with(this).  
                9.                 load(R.drawable.test).  
                10.                 placeholder(R.drawable.bg_loading).//加载中显示的图片  
                11.                 error(R.drawable.bg_error).//加载失败时显示的图片  
                12.                 crossFade(1000).//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap  
                13.                 override(80, 80).//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高  
                14.                 centerCrop().//中心裁剪,缩放填充至整个ImageView  
                15.                 skipMemoryCache(true).//跳过内存缓存  
                16.                 diskCacheStrategy(DiskCacheStrategy.RESULT).//保存最终图片  
                17.                 into(targetView);  
                18.     }  
                19. }


                缓存设置



                在GlideModule 中,我们可以设置磁盘缓存的位置,磁盘缓存的大小和内存缓存的大小,同时还可以设置图片的显示质量.

                要是用GlideModule ,需要创建它的实现类,然后在manifests中申明实现类的全类路径:




                1. <meta-data  
                2. android:name="com.example.greathfs.httputilsdemo.image.glide.module.SimpleGlideModule"  
                3. android:value="GlideModule" />


                GlideModule 的实现类,需要实现applyOptions方法:






                  1. /**  
                  2.  * 所以你知道要创建一个额外的类去定制 Glide。  
                  3.  * 下一步是要全局的去声明这个类,让 Glide 知道它应该在哪里被加载和使用。  
                  4.  * Glide 会扫描 AndroidManifest.xml 为 Glide module 的 meta 声明。  
                  5. <application> 标签内去声明这个SimpleGlideModule。  
                  6.  * Created by mChenys on 2016/6/10.  
                  7.  */  
                  8. public class SimpleGlideModule implements GlideModule {  
                  9.     public static DiskCache cache;  
                  10.   
                  11.     @Override  
                  12.     public void applyOptions(Context context, GlideBuilder builder) {  
                  13.         // 在 Android 中有两个主要的方法对图片进行解码:ARGB8888 和 RGB565。前者为每个像素使用了 4 个字节,  
                  14.         // 后者仅为每个像素使用了 2 个字节。ARGB8888 的优势是图像质量更高以及能存储一个 alpha 通道。  
                  15.         // Picasso 使用 ARGB8888,Glide 默认使用低质量的 RGB565。  
                  16.         // 对于 Glide 使用者来说:你使用 Glide module 方法去改变解码规则。  
                  17.         builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);  
                  18.         //设置缓存目录  
                  19. cacheDir = PathUtils.getDiskCacheDir(context, CacheConfig.IMG_DIR);  
                  20.   
                  21. cache = DiskLruCacheWrapper.get(cacheDir, DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE);// 250 MB  
                  22.         builder.setDiskCache(new DiskCache.Factory() {  
                  23.             @Override  
                  24.             public DiskCache build() {  
                  25.                 return cache;  
                  26.             }  
                  27.         });  
                  28.         //设置memory和Bitmap池的大小  
                  29. calculator = new MemorySizeCalculator(context);  
                  30. defaultMemoryCacheSize = calculator.getMemoryCacheSize();  
                  31. defaultBitmapPoolSize = calculator.getBitmapPoolSize();  
                  32.   
                  33. customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize);  
                  34. customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize);  
                  35.   
                  36.         builder.setMemoryCache(new LruResourceCache(customMemoryCacheSize));  
                  37.         builder.setBitmapPool(new LruBitmapPool(customBitmapPoolSize));  
                  38.     }  
                  39.   
                  40.     @Override  
                  41.     public void registerComponents(Context context, Glide glide) {  
                  42.     }  
                  43. }



                  设置加载缩略图



                  通过设置缩略图,我们可以在显示目标图片之前先展示一个第分辨率或者其他图片,当全分辨率的目标图片在后台加载完成后, 
                  Glide会自动切换显示全像素的目标图片.

                  设置缩略图有2种方式: 
                  通过thumbnail(float)指定0.0f~1.0f的原始图像大小,例如全像素的大小是500*500,如果设置为thumbnail为0.1f,即目标图片的10%,显示的缩略图大小就是50*50;



                  1. public class TestGlideActivity extends Activity {  
                  2.     @Override  
                  3.     protected void onCreate(Bundle savedInstanceState) {  
                  4.         super.onCreate(savedInstanceState);  
                  5.         setContentView(R.layout.activity_test);  
                  6. targetView = (ImageView) findViewById(R.id.iv_target);  
                  7.   
                  8.         Glide.with(this).  
                  9.                 load(R.drawable.test).  
                  10.                 placeholder(R.drawable.bg_loading).//加载中显示的图片  
                  11.                 error(R.drawable.bg_error).//加载失败时显示的图片  
                  12.                 crossFade(1000).//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap  
                  13.                 override(80, 80).//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高  
                  14.                 centerCrop().//中心裁剪,缩放填充至整个ImageView  
                  15.                 skipMemoryCache(true).//跳过内存缓存  
                  16.                 diskCacheStrategy(DiskCacheStrategy.RESULT).//保存最终图片  
                  17.                 thumbnail(0.1f).//10%的原图大小  
                  18.                 into(targetView);  
                  19.     }  
                  20. }


                  通过thumbnail(DrawableRequestBuilder)方式来指定缩略图,该缩略图可以使用load的所有方式(网络,文件,uri,资源)加载.


                  1. public class TestGlideActivity extends Activity {  
                  2.     @Override  
                  3.     protected void onCreate(Bundle savedInstanceState) {  
                  4.         super.onCreate(savedInstanceState);  
                  5.         setContentView(R.layout.activity_test);  
                  6. targetView = (ImageView) findViewById(R.id.iv_target);  
                  7.         //缩略图请求  
                  8. <String> thumbnailRequest = Glide  
                  9.                 .with(this)  
                  10.                 .load("http://www.qq745.com/uploads/allimg/141106/1-141106153Q5.png");  
                  11.   
                  12.         Glide.with(this).  
                  13.                 load(R.drawable.test).  
                  14. //                placeholder(R.drawable.bg_loading).//加载中显示的图片  
                  15. //                error(R.drawable.bg_error).//加载失败时显示的图片  
                  16. //                crossFade(1000).//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap  
                  17.                 override(80, 80).//设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高  
                  18.                 centerCrop().//中心裁剪,缩放填充至整个ImageView  
                  19.                 skipMemoryCache(true).//跳过内存缓存  
                  20.                 diskCacheStrategy(DiskCacheStrategy.RESULT).//保存最终图片  
                  21.                 thumbnail(thumbnailRequest).//设置缩略图  
                  22.                 into(targetView);  
                  23.     }  
                  24. }


                  动画处理

                  通过animate()方法可以设置xml文件定义的4种补间动画(alpha、scale、translate、rotate) 
                  例如:

                  res\anim\left_in.xml




                  1. <?xml version="1.0" encoding="utf-8"?>  
                  2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
                  3. <translate  
                  4. android:duration="@android:integer/config_mediumAnimTime"  
                  5. android:fromXDelta="-50%p"  
                  6. android:toXDelta="0"/>  
                  7. <alpha  
                  8. android:duration="@android:integer/config_mediumAnimTime"  
                  9. android:fromAlpha="0.0"  
                  10. android:toAlpha="1.0"/>  
                  11. </set>


                  使用方式:



                  1. public class TestGlideActivity extends Activity {  
                  2.     @Override  
                  3.     protected void onCreate(Bundle savedInstanceState) {  
                  4.         super.onCreate(savedInstanceState);  
                  5.         setContentView(R.layout.activity_test);  
                  6. targetView = (ImageView) findViewById(R.id.iv_target);  
                  7.         Glide.with(this).  
                  8.                 load(R.drawable.test).  
                  9.                 asBitmap().  
                  10.                 animate(R.anim.left_in).//加载xml文件定义的动画  
                  11.                 into(targetView);  
                  12.     }  
                  13. }


                  处理此外,还可以通过animate指定属性动画:



                  1. public class TestGlideActivity extends Activity {  
                  2.     @Override  
                  3.     protected void onCreate(Bundle savedInstanceState) {  
                  4.         super.onCreate(savedInstanceState);  
                  5.         setContentView(R.layout.activity_test);  
                  6. targetView = (ImageView) findViewById(R.id.iv_target);  
                  7.   
                  8. animationObject = new ViewPropertyAnimation.Animator() {  
                  9.             @Override  
                  10.             public void animate(View view) {  
                  11.                 //设置属性动画  
                  12. moveIn = ObjectAnimator.ofFloat(view, "translationX", -500f, 0f);  
                  13. rotate = ObjectAnimator.ofFloat(view, "rotation", 0f, 360f);  
                  14. fadeInOut = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f, 1f);  
                  15. moveTop = ObjectAnimator.ofFloat(view, "translationY", 0f, -2000, 0f);  
                  16. animSet = new AnimatorSet();  
                  17.                 //先左进,然后旋转伴随淡入效果,最后移动向上  
                  18.                 animSet.play(rotate).with(fadeInOut).after(moveIn).before(moveTop);  
                  19.                 animSet.setDuration(5000);  
                  20.                 animSet.start();  
                  21.             }  
                  22.         };  
                  23.         Glide.with(this).  
                  24.                 load(R.drawable.test).  
                  25.                 asBitmap().  
                  26.                 animate(animationObject).//加载属性动画  
                  27.                 into(targetView);  
                  28.     }  
                  29. }