Glide 是当前用的比较多的网络图片加载框架,加载网络图片很流畅
实现:
1、设置网络权限
<uses-permission android:name="android.permission.INTERNET" />
2、添加依赖
dependencies {
//网络图片加载依赖
implementation 'com.github.bumptech.glide:glide:3.7.0'
}
3、使用
基础用法
public static void displayImage(Context context, Object path, ImageView imageView) {
Glide.with(context)
.load(path.toString())
.into(imageView);
}
常用属性展示
//常用的属性
public static void displayImageExperiment(Context context, Object path, ImageView imageView) {
//with 可用于启动加载的顶级应用程序的RequestManager
Glide.with(context)
//文件路径(加载图片的网络位置,也可以是GIF,和本地视频-网络视频不行)
//.load( Uri.fromFile( new File( filePath ) ) ) 本地视频
.load(path.toString())
//占位图设置(加载错误或者加载失败时显示的图片)图片自己设置
//placeholder() 和 error() 的参数都是只支持 int 和 Drawable 类型的参数,这种设计应该是考虑到使用本地图片
.placeholder(R.drawable.ic_launcher_background)//图片加载出来前,显示的图片
.error(R.drawable.ic_launcher_background)//图片加载失败后,显示的图片
//缩略图,参数是flost类型,作为其倍数大小
.thumbnail( 0.2f )
//动画开关 - crossFade() 方法强制开启 Glide 默认的图片淡出淡入动画(也可以自定义动画效果哦)
.crossFade()//或者使用 dontAnimate() 关闭动画
//图片大小与裁剪
.override(100,70)//这里的单位是px
//图片的缓存处理 (内存缓存、磁盘缓存)
/*
* DiskCacheStrategy.NONE 什么都不缓存
* DiskCacheStrategy.SOURCE 只缓存全尺寸图
* DiskCacheStrategy.RESULT 只缓存最终的加载图
* DiskCacheStrategy.ALL 缓存所有版本图(默认行为)
* */
.diskCacheStrategy( DiskCacheStrategy.SOURCE )
//图片请求的优先级,如果同时加载很多图片,就可以设置优先级(分为:立即、高、正常、低、优先)
/*
* IMMEDIATE,
* HIGH,
* NORMAL,
* LOW,
* priority,
* */
.priority (Priority.priority )
//设置布局,加载的图片显示布局
.into(imageView);
}
3、清除缓存
清除内存缓存
public static void clearMemory(Context context) {
Glide.get(context).clearMemory();//清理内存缓存 可以在UI主线程中进行
}
清除磁盘缓存
public static void clearDiskCache(final Context context) {
new Thread(new Runnable() {
@Override
public void run() {
Glide.get(context).clearDiskCache();//清理磁盘缓存 需要在子线程中执行
}
}).start();
}
图片加载的方法可以根据自己的需要封装到Utils类中,方便调用,出了基础用法中的必要属性,其他的属性可以自由配置
4、进阶-图片处理
如果需要圆形、圆角,模糊等处理操作,可以添加下面的依赖
implementation 'jp.wasabeef:glide-transformations:2.0.1'
5、进阶方法示例
//常量
static class Contants {
public static final int BLUR_VALUE = 20; //模糊度
public static final int CORNER_RADIUS = 20; //圆角角度
public static final float THUMB_SIZE = 0.5f; //0-1之间 10%原图的大小
}
/**
* 常规加载图片
* @param context
* @param imageView 图片容器
* @param imgUrl 图片地址
* @param isFade 是否需要动画
*/
public void loadImage(Context context, ImageView imageView,
String imgUrl, boolean isFade) {
if (isFade) {
Glide.with(context)
.load(imgUrl)
.placeholder(R.mipmap.ic_launcher)
.dontAnimate()
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
//all:缓存源资源和转换后的资源 none:不作任何磁盘缓存
//source:缓存源资源 result:缓存转换后的资源
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.into(imageView);
} else {
Glide.with(context)
.load(imgUrl)
//.error(R.mipmap.error)
.into(imageView);
}
}
/**
* 加载图片并设置为指定大小
* @param context
* @param imageView
* @param imgUrl
* @param withSize
* @param heightSize
*/
public void loadOverrideImage(Context context, ImageView imageView,
String imgUrl, int withSize, int heightSize) {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.override(withSize, heightSize)
.into(imageView);
}
/**
* 加载图片并对其进行模糊处理
* @param context
* @param imageView
* @param imgUrl
*/
public void loadBlurImage(Context context, ImageView imageView, String imgUrl) {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.bitmapTransform(new BlurTransformation(context, Contants.BLUR_VALUE))
.into(imageView);
}
/**
* 加载圆图
* @param context
* @param imageView
* @param imgUrl
*/
public void loadCircleImage(Context context, ImageView imageView, String imgUrl) {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.bitmapTransform(new CropCircleTransformation(context))
.into(imageView);
}
/**
* 加载模糊的圆形的图片
* @param context
* @param imageView
* @param imgUrl
*/
public void loadBlurCircleImage(Context context, ImageView imageView, String imgUrl) {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.bitmapTransform(
new BlurTransformation(context, Contants.BLUR_VALUE),
new CropCircleTransformation(context))
.into(imageView);
}
/**
* 加载圆角图片
* @param context
* @param imageView
* @param imgUrl
*/
public void loadCornerImage(Context context, final ImageView imageView, String imgUrl) {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.bitmapTransform(
new RoundedCornersTransformation(
context, Contants.CORNER_RADIUS, Contants.CORNER_RADIUS))
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
if (imageView == null) {
return false;
}
if (imageView.getScaleType() != ImageView.ScaleType.FIT_XY) {
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
}
ViewGroup.LayoutParams params = imageView.getLayoutParams();
int vw = imageView.getWidth() - imageView.getPaddingLeft() - imageView.getPaddingRight();
float scale = (float) vw / (float) resource.getIntrinsicWidth();
int vh = Math.round(resource.getIntrinsicHeight() * scale);
params.height = vh + imageView.getPaddingTop() + imageView.getPaddingBottom();
imageView.setLayoutParams(params);
return false;
}
})
.into(imageView);
}
/**
* 加载模糊的圆角图片
* @param context
* @param imageView
* @param imgUrl
*/
public void loadBlurCornerImage(Context context, ImageView imageView, String imgUrl) {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.bitmapTransform(
new BlurTransformation(context, Contants.BLUR_VALUE),
new RoundedCornersTransformation(
context, Contants.CORNER_RADIUS, Contants.CORNER_RADIUS))
.into(imageView);
}