Android-图片加载库Glide
Sep 11, 2019
Glide 基本用法
- 添加依赖123456dependencies {compile 'com.github.bumptech.glide:glide:3.7.0'}//implementation 'com.github.bumptech.glide:glide:4.4.0'//这个版本的需要SDK version 27.0.2<uses-permission android:name="android.permission.INTERNET" />
在代码中使用:
1Glide.with(this).load(url).into(imageView);加载其他的图片
123456789101112131415// 加载本地图片File file = new File(getExternalCacheDir() + "/image.jpg");Glide.with(this).load(file).into(imageView);// 加载应用资源int resource = R.drawable.image;Glide.with(this).load(resource).into(imageView);// 加载二进制流byte[] image = getImageBytes();Glide.with(this).load(image).into(imageView);// 加载Uri对象Uri imageUri = getImageUri();Glide.with(this).load(imageUri).into(imageView);占位图
1234Glide.with(this).load(url).placeholder(R.drawable.loading).into(imageView);缓存策略
12345Glide.with(this).load(url).placeholder(R.drawable.loading).diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView);错误图片
123456Glide.with(this).load(url).placeholder(R.drawable.loading).error(R.drawable.error).diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView);加载圆 Transformer
要在 ImageView 中去设置 scaleType 为 centerCrop。但是,当你同时给图片设置圆角类 Transformer 时,即在 Glide 加载图片时给 .transform() 配置了一个圆角矩形,如果同时 ImageView 的 scaleType 设置了 centerCrop,那圆角就没有了。
- 解决办法123456789101112131415161718192021222324252627282930313233343536373839404142....transform(new CenterCrop(getContext()),new GlideRoundTransform(getContext(), 25))public class GlideRoundTransform extends BitmapTransformation {private static float radius = 0f;public GlideRoundTransform(Context context) {this(context, 4);}public GlideRoundTransform(Context context, int dp) {super(context);this.radius = Resources.getSystem().getDisplayMetrics().density * dp;}protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {return roundCrop(pool, toTransform);}private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {if (source == null) return null;Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);if (result == null) {result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);}Canvas canvas = new Canvas(result);Paint paint = new Paint();paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));paint.setAntiAlias(true);RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());canvas.drawRoundRect(rectF, radius, radius, paint);return result;}public String getId() {return getClass().getName() + Math.round(radius);}}
- 缓存
缓存参数说明
- DiskCacheStrategy.NONE:不缓存任何图片,即禁用磁盘缓存
- DiskCacheStrategy.ALL :缓存原始图片 & 转换后的图片(默认)
- DiskCacheStrategy.SOURCE:只缓存原始图片(原来的全分辨率的图像,即不缓存转换后的图片)
- DiskCacheStrategy.RESULT:只缓存转换后的图片(即最终的图像:降低分辨率后 / 或者转换后 ,不缓存原始图片
|
|
加载圆角
123Glide.with(context).load(url).apply(RequestOptions.circleCropTransform()).into(imageView);Glide.with(this).load(url).bitmapTransform(new RoundedCornersTransformation(this, 30, 0, RoundedCornersTransformation.CornerType.BOTTOM)).crossFade(1000).into(image5);高斯模糊
需要引入 高斯模糊库
12345678Glide.with(MusicPlayerActivity.this).load(service.getImageUri()).dontAnimate().error(R.drawable.no_music_rotate_img)// 设置高斯模糊// “14”:设置模糊度(在0.0到25.0之间),默认”25";"3":图片缩放比例,默认“1”。.bitmapTransform(new BlurTransformation(this, 14, 3)).into(allBg);
使用Glide的Tips
- 列表预加载
如果你想让列表预加载的话,不妨试一下ListPreloader这个类。 列表滑动时取消请求
当列表在滑动的时候,调用 pauseRequests() 取消请求,滑动停止时,调用 resumeRequests() 恢复请求。12Glide.with(context).resumeRequests()Glide.with(context).pauseRequests()清除所有加载请求
当你想清除掉所有的图片加载请求时,可以使用 Glide.clear() 这个方法。- Glide特效转换库
glide-transformations 一个基于Glide的transformation库,拥有裁剪,着色,模糊,滤镜等多种转换效果。 - Palette 库
GlidePalette 一个在Glide加载时很方便使用Palette的库。GitHub - florent37/GlidePalette: Android Lollipop Palette is now easy to use with Glide - 不要再非主线程里面使用 Glide 加载图片,如果真的使用了,请把 context 参数换成 getApplicationContext。
- Glide图片和默认图交替过程中,默认图闪烁一下
解决方法:
去掉动画:dontAnimate()