官方介绍
Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。
Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。Glide的Api是如此的灵活,开发者甚至可以插入和替换成自己喜爱的任何网络栈。默认情况下,Glide使用的是一个定制化的基于HttpUrlConnection的栈,但同时也提供了与Google Volley和Square OkHttp快速集成的工具库。
虽然Glide 的主要目标是让任何形式的图片列表的滚动尽可能地变得更快、更平滑,但实际上,Glide几乎能满足你对远程图片的拉取/缩放/显示的一切需求。
简单用法
Glide.with(fragment) .load(url) .into(imageView);
关于性能的介绍
Glide 充分考虑了Android图片加载性能的两个关键方面:
- 图片解码速度
- 解码图片带来的资源压力
为了让用户拥有良好的App使用体验,图片不仅要快速加载,而且还不能因为过多的主线程I/O或频繁的垃圾回收导致页面的闪烁和抖动现象。
Glide使用了多个步骤来确保在Android上加载图片尽可能的快速和平滑:
- 自动、智能地下采样(downsampling)和缓存(caching),以最小化存储开销和解码次数;
- 积极的资源重用,例如字节数组和Bitmap,以最小化昂贵的垃圾回收和堆碎片影响;
- 深度的生命周期集成,以确保仅优先处理活跃的Fragment和Activity的请求,并有利于应用在必要时释放资源以避免在后台时被杀掉。
对Glide加载框架进行自己的封装
public class GlideUtil { public static final String TAG = "GlideUtil"; /** * Glide的请求管理器类 */ private static RequestManager mRequestManager; private static Context mContext; /** * 初始化Glide工具 * * @param context */ public static void init(Context context) { mContext = context; mRequestManager = Glide.with(context); } /** * Glide工具类是否已经初始化 * * @return 已初始化则返回true */ public static boolean isInit() { if (mContext == null || mRequestManager == null) { Log.i(TAG, TAG + "not initComponent"); return false; } return true; } /** * 加载图片的基础方法 * * @param url * @param imageView * @param isCache * @param shapeType * @param defaultImg */ public static void loadPicture(Object url, ImageView imageView, boolean isCache, int scaleType, int shapeType, @DrawableRes int defaultImg) { if (!isInit()) { return; } RequestOptions options = new RequestOptions(); if (scaleType == BaseConstant.GLIDE_SCALE_TYPE_CENTER_CROP) { options.centerCrop(); } else if (scaleType == BaseConstant.GLIDE_SCALE_TYPE_FIT_CENTER) { options.fitCenter(); } if (shapeType == BaseConstant.GLIDE_SHAPE_TYPE_CIRCLE) { options = RequestOptions.bitmapTransform(new CircleCrop()); } if (isCache) { options.diskCacheStrategy(DiskCacheStrategy.RESOURCE); } else { options.diskCacheStrategy(DiskCacheStrategy.NONE); } if (defaultImg != -1) { options.placeholder(defaultImg); } options.dontAnimate(); mRequestManager .load(url) .apply(options).into(imageView); } /** * 加载正方形的网络图片 * * @param url 网络地址 * @param imageView 目标控件 */ public static void loadPicture(String url, ImageView imageView) { loadPicture(url, imageView, true, BaseConstant.GLIDE_SCALE_TYPE_NULL, BaseConstant.GLIDE_SHAPE_TYPE_SQUARE, -1); } /** * 跳过缓存加载图片 * * @param url * @param imageView */ public static void loadPictureSkipMemory(String url, ImageView imageView) { loadPicture(url, imageView, false, BaseConstant.GLIDE_SCALE_TYPE_NULL, BaseConstant.GLIDE_SHAPE_TYPE_SQUARE, -1); } /** * 加载方形的图片 图片剪裁方式fitCenter * * @param url * @param imageView * @param defaultImg */ public static void loadPictureFitCenter(String url, ImageView imageView, @DrawableRes int defaultImg) { loadPicture(url, imageView, true, BaseConstant.GLIDE_SCALE_TYPE_FIT_CENTER, BaseConstant.GLIDE_SHAPE_TYPE_SQUARE, defaultImg); } public static void loadPictureFitCenter(String url, ImageView imageView) { loadPicture(url, imageView, true, BaseConstant.GLIDE_SCALE_TYPE_FIT_CENTER, BaseConstant.GLIDE_SHAPE_TYPE_SQUARE, -1); } /** * 加载方形的图片 图片剪裁方式CenterCrop * * @param url * @param imageView * @param defaultImg */ public static void loadPictureCenterCrop(String url, ImageView imageView, @DrawableRes int defaultImg) { loadPicture(url, imageView, true, BaseConstant.GLIDE_SCALE_TYPE_CENTER_CROP, BaseConstant.GLIDE_SHAPE_TYPE_SQUARE, defaultImg); } public static void loadPictureCenterCrop(String url, ImageView imageView) { loadPicture(url, imageView, true, BaseConstant.GLIDE_SCALE_TYPE_CENTER_CROP, BaseConstant.GLIDE_SHAPE_TYPE_SQUARE, -1); } /** * 加载圆形的网络图片 * * @param url 网络地址 * @param imageView 目标控件 */ public static void loadCirclePicture(String url, ImageView imageView) { loadPicture(url, imageView, true, BaseConstant.GLIDE_SCALE_TYPE_CENTER_CROP, BaseConstant.GLIDE_SHAPE_TYPE_CIRCLE, -1); } /** * 加载圆形的网络图片 * * @param url 网络地址 * @param imageView 目标控件 * @param defaultImg 默认的图片 若不需要则输入-1 */ public static void loadCirclePicture(String url, ImageView imageView, @DrawableRes int defaultImg) { loadPicture(url, imageView, true, BaseConstant.GLIDE_SCALE_TYPE_NULL, BaseConstant.GLIDE_SHAPE_TYPE_CIRCLE, defaultImg); } /** * 加载资源图片文件 * * @param resId * @param imageView */ public static void loadDrawableRes(@DrawableRes int resId, ImageView imageView) { loadPicture(resId, imageView, true, BaseConstant.GLIDE_SCALE_TYPE_CENTER_CROP, BaseConstant.GLIDE_SHAPE_TYPE_SQUARE, -1); }}
旧版的Glide加载圆形或者圆角图片是需要自己定义转换方法的
例如,圆形的转换类GlideCircleTransform
public class GlideCircleTransform extends BitmapTransformation { public GlideCircleTransform() { } private static Bitmap circleCrop(BitmapPool pool, Bitmap source) { if (source == null) return null; int size = Math.min(source.getWidth(), source.getHeight()); int x = (source.getWidth() - size) / 2; int y = (source.getHeight() - size) / 2; Bitmap squared = Bitmap.createBitmap(source, x, y, size, size); Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888); if (result == null) { result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); float r = size / 2f; canvas.drawCircle(r, r, r, paint); return result; } @Override public void updateDiskCacheKey(MessageDigest messageDigest) { } @Override protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) { return circleCrop(pool, toTransform); }}
圆角转换类GlideRoundTransform
public class GlideRoundTransform extends BitmapTransformation { private static float radius = 0f; public GlideRoundTransform() { this(4); } public GlideRoundTransform(int dp) { super(); this.radius = Resources.getSystem().getDisplayMetrics().density * dp; } @Override 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; } @Override public void updateDiskCacheKey(MessageDigest messageDigest) { }}
但在新版的Glide中以及提供了基础类CircleCrop进行代替,可以直接用CircleCrop进行圆形图片的加载
自己封装的工具类的使用方法
在Application类中进行工具类的初始化
public class StandardApp extends FrameApplication { @Override public void onCreate() { super.onCreate(); ... //初始化图片加载框架 GlideUtil.init(getApplicationContext()); ... }}
然后在需要加载图片的地方
GlideUtil.loadPicture(“图片链接”, [图片控件]);
开发准则,把重复的部分封装起来,让代码更加简洁明了。