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); }