天天看点

glide加载图片闪烁_Android Glide图片加载框架介绍

glide加载图片闪烁_Android Glide图片加载框架介绍

官方介绍

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(“图片链接”, [图片控件]);
           

开发准则,把重复的部分封装起来,让代码更加简洁明了。