简介
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. }