[安卓开发] Glide图片加载库的简单封装使用

Glide简单封装,支持CircleImageView,不会导致CircleImageview空白。方便自己使用。

最新源码在Github地址:https://github.com/tpnet/GlideUtils,打开后点一下右上角的 star,谢谢

源码:注释基本都在里面了。

package com.minstone.util.Glide;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.widget.ImageView;

import com.bumptech.glide.DrawableTypeRequest;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.load.resource.gif.GifDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.target.Target;
import com.minstone.mdoctor.R;
import com.minstone.util.DensityUtil;
import com.minstone.util.LogUtil;
import com.minstone.view.CircleImageView;

import java.io.File;

/**
 * Created by litp on 2016/8/6.
 */
public abstract class GlideUtils {


    //图片加载监听器
    public abstract interface ImageLoadListener {

        /**
         * 图片加载成功回调
         *
         * @param uri      图片url 或资源id 或 文件
         * @param view     目标载体,不传则为空
         * @param resource 返回的资源,GlideDrawable或者Bitmap或者GifDrawable,ImageView.setImageRecourse设置
         */
        <T, K> void onLoadingComplete(T uri, ImageView view, K resource);

        /**
         * 图片加载异常返回
         *
         * @param source   图片地址、File、资源id
         * @param e 异常信息
         */
        <T> void onLoadingError(T source, Exception e);

    }


    public abstract interface ImageLoadDetailListener {

        /**
         * 图片加载成功回调
         *
         * @param uri      图片url 或资源id 或 文件
         * @param view     目标载体,不传则为空
         * @param resource 返回的资源,GlideDrawable或者Bitmap或者GifDrawable,ImageView.setImageRecourse设置
         */
        <T, K> void onLoadingComplete(T uri, ImageView view, K resource);

        /**
         * 图片加载异常返回
         *
         * @param source   图片地址、File、资源id
         * @param e 异常信息
         */
        <T> void onLoadingError(T source, Exception e);

        <T> void onLoadingStart(T source);

    }


    /**
     * 根据上下文和 url获取 Glide的DrawableTypeRequest
     *
     * @param context 上下文
     * @param url     图片连接
     * @param <T>     Context类型
     * @param <K>     url类型
     * @return 返回DrawableTypeRequst<K> 类型
     */
    private static <T, K> DrawableTypeRequest<K> getContext(T context, K url) {
        DrawableTypeRequest<K> type = null;
        try{
            if (context instanceof android.support.v4.app.Fragment) {
                type = Glide.with((android.support.v4.app.Fragment) context).load(url);
            } else if (context instanceof android.app.Fragment) {
                type = Glide.with((android.app.Fragment) context).load(url);
            } else if (context instanceof Activity) {    //包括FragmentActivity
                type = Glide.with((Activity) context).load(url);
            } else if (context instanceof Context) {
                type = Glide.with((Context) context).load(url);
            }
        }catch (Exception e){
            e.printStackTrace();
            LogUtil.e("Glide的Context错误");
        }

        return type;
    }


    /**
     * 图片加载监听类
     *
     * @param <T> 图片链接 的类型
     * @param <K> 图片资源返回类型
     * @param <Z> 返回的图片url
     */
    private static class GlideListener<T, K, Z> implements RequestListener<T, K> {

        ImageLoadListener imageLoadListener = null;
        Z url;
        ImageView imageView = null;

        GlideListener(ImageLoadListener imageLoadListener, Z url, ImageView view) {
            this.imageLoadListener = imageLoadListener;
            this.url = url;
            this.imageView = view;
        }

        GlideListener(ImageLoadListener imageLoadListener, Z url) {
            this.imageLoadListener = imageLoadListener;
            this.url = url;
        }

        GlideListener(Z url) {
            this.url = url;
        }

        @Override
        public boolean onResourceReady(K resource, T model, Target<K> target, boolean isFromMemoryCache, boolean isFirstResource) {
            if (null != imageLoadListener) {
                if (imageView != null) {
                    imageLoadListener.onLoadingComplete(url, imageView, resource);
                } else {
                    LogUtil.e("加载完成回调");
                    imageLoadListener.onLoadingComplete(url, null, resource);
                }
            }

            return false;
        }

        @Override
        public boolean onException(Exception e, T model, Target<K> target, boolean isFirstResource) {
            if (imageLoadListener != null) {
                imageLoadListener.onLoadingError(url, e);
            }
            return false;
        }
    }


    /**
     * 获取存储器上的图片,回调返回GlideDrawable
     *
     * @param context           上下文年
     * @param file              文件File
     * @param imageLoadListener 回调监听器
     */
    public static <T> void loadImage(T context, final File file, final ImageLoadListener imageLoadListener) {
        DrawableTypeRequest<File> type = getContext(context, file);
        if(type != null){
            type.listener(new GlideListener<File, GlideDrawable, File>(imageLoadListener, file));
        }
    }

    /**
     * 获取资源中的图片,回调返回GlideDrawable
     *
     * @param context           上下文
     * @param resourceId        资源id
     * @param imageLoadListener 回调监听器
     */
    public static <T> void loadImage(T context, final int resourceId, final ImageLoadListener imageLoadListener) {
        DrawableTypeRequest<Integer> type = getContext(context, resourceId);
        if(type != null){
            type.listener(new GlideListener<Integer, GlideDrawable, Integer>(imageLoadListener, resourceId));
        }

    }

    /**
     * 获取网络图片,回调返回 GlideDrawable
     *
     * @param context           上下文
     * @param url               图片url
     * @param imageLoadListener 回调监听器
     */
    public static <T> void loadImage(T context, final String url, final ImageLoadListener imageLoadListener) {
        DrawableTypeRequest<String> type = getContext(context, url);
        if(type != null){
            type.listener(new GlideListener<String, GlideDrawable, String>(imageLoadListener, url));
        }

    }

    /**
     * 加载存储器上的图片到目标载体
     *
     * @param file      文件File
     * @param imageView 要显示到的图片ImageView
     */
    public static void loadImage(final File file, final ImageView imageView, final ImageLoadListener imageLoadListener) {
        Glide.with(imageView.getContext())
                .load(file)
                .listener(new GlideListener<File, GlideDrawable, File>(imageLoadListener, file, imageView))
                .into(imageView);
    }

    /**
     * 加载资源中的图片到目标载体
     *
     * @param resourceId 资源id
     * @param imageView  图片View
     */
    public static void loadImage(final int resourceId, final ImageView imageView, final ImageLoadListener imageLoadListener) {
        Glide.with(imageView.getContext())
                .load(resourceId)
                .listener(new GlideListener<Integer, GlideDrawable, Integer>(imageLoadListener, resourceId, imageView))
                .into(imageView);
    }


    /**
     * 加载圆形头像,用的是普通ImageView,有动画效果
     *
     * @param url               图片url
     * @param imageView         要显示到的ImageView
     * @param imageLoadListener 加载回调监听器
     * @param parms             设置占位符和加载失败图片
     */
    public static void loadCircleImage(final String url, final ImageView imageView, final ImageLoadListener imageLoadListener, final int... parms) {
        DrawableTypeRequest<String> type = Glide.with(imageView.getContext()).load(url);
        if (parms != null && parms.length > 0) {
            type.placeholder(parms[0]);   //占位符
            if (parms.length > 1) {
                type.error(parms[1]);    //图片加载失败显示图片
            }
        }
        type.transform(new CircleTransform(imageView.getContext()));
        type.listener(new GlideListener<String, GlideDrawable, String>(imageLoadListener, url, imageView))
                .into(imageView);
    }


    /**
     * 加载网络图片到指定Imageview,支持CircleImageView
     *
     * @param url               图片url
     * @param imageView         要显示的Imageview
     * @param imageLoadListener 图片加载回调
     * @param parms             第一个是error的图片
     */
    public static <T> void loadImage(T context,final String url, final ImageView imageView, final ImageLoadListener imageLoadListener, final int... parms) {
        DrawableTypeRequest<String> type = getContext(context,url);
        if(type != null){
            type.asBitmap();
            if (parms != null && parms.length > 0) {
                type.placeholder(parms[0]);   //占位符
                if (parms.length > 1) {
                    type.error(parms[1]);    //图片加载失败显示图片
                }
            }

            //单张CircleImageView不允许动画,不然会不显示,
            if (imageView instanceof CircleImageView) {
                type.dontAnimate();
            }
            type.listener(new GlideListener<String, GlideDrawable, String>(imageLoadListener, url, imageView))
                    .into(imageView);
        }
    }

    /**
     * 加载一帧视频,添加圆角
     *
     * @param url       图片地址
     * @param imageView 要加载到的ImageView
     */
    public static void loadImageFormVideo(String url, ImageView imageView) {
        Glide.with(imageView.getContext()).load(url)
                .override(DensityUtil.dip2px(150), DensityUtil.dip2px(150))
                .placeholder(R.drawable.default_article_image)
                .dontAnimate()
                .into(imageView);
    }


    public static <T> void loadImageDetail(final T context, final String url, final ImageView imageView, final Drawable drawable, final ImageLoadDetailListener imageLoadListener) {
        DrawableTypeRequest<String> type = getContext(context, url);
        if(type != null){
            type.into(new SimpleTarget<GlideDrawable>() {
                @Override
                public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
                    if(imageView != null && resource != null){
                        imageView.setImageDrawable(resource);
                    }
                    if (imageLoadListener != null) {
                        imageLoadListener.onLoadingComplete(url, imageView, resource);
                    }

                }

                @Override
                public void onStart() {
                    super.onStart();
                    if(drawable != null && imageView != null){
                        imageView.setImageDrawable(drawable);
                    }

                }

                @Override
                public void onLoadStarted(Drawable placeholder) {
                    super.onLoadStarted(placeholder);
                    if (imageLoadListener != null) {
                        imageLoadListener.onLoadingStart(placeholder);
                    }

                }

                @Override
                public void onLoadFailed(Exception e, Drawable errorDrawable) {
                    super.onLoadFailed(e, errorDrawable);
                    if (imageLoadListener != null) {
                        imageLoadListener.onLoadingError(errorDrawable, e);
                    }
                }
            });
        }

    }


    /**
     * 加载bitmap,回调返回 Bitmap
     *
     * @param context           上下文
     * @param url               图片url
     * @param imageLoadListener 图片加载监听器
     * @param <T>               上下文类型
     */
    public static <T> void loadImageBitmap(T context, final String url, final ImageLoadListener imageLoadListener) {
        DrawableTypeRequest<String> type = getContext(context, url);
        if(type != null){
            type.asBitmap().listener(new GlideListener<String, Bitmap, String>(imageLoadListener, url));
        }
    }


    /**
     * 加载GifDrawable,回调返回 GifDrawable
     *
     * @param context           上下文
     * @param url               图片url
     * @param imageLoadListener 图片加载监听器
     */
    public static <T> void loadImageGif(T context, final String url, final ImageLoadListener imageLoadListener) {
        DrawableTypeRequest<String> type = getContext(context, url);
        if(type != null){
            type.asGif()
                    .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                    .listener(new GlideListener<String, GifDrawable, String>(imageLoadListener, url));

        }
}


    /**
     * 加载GifDrawable,回调返回 GifDrawable
     *
     * @param url               图片url
     * @param imageLoadListener 图片加载监听器
     */
    public static void loadImageGifThum(final String url, ImageView imageView, final ImageLoadListener imageLoadListener, Drawable drawable) {
        if(drawable != null){
            imageView.setImageDrawable(drawable);
        }
        DrawableTypeRequest<String> type = Glide.with(imageView.getContext()).load(url);
        type.asBitmap()
                .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                .listener(new GlideListener<String, Bitmap, String>(imageLoadListener, url))
                .into(imageView);
    }


    /**
     * 加载gif图片到指定ImageView
     *
     * @param url               图片Url
     * @param imageView         图片View
     * @param imageLoadListener 图片加载监听器
     */
    public static void loadImageGif(final String url, final ImageView imageView, final ImageLoadListener imageLoadListener) {
        DrawableTypeRequest<String> type = Glide.with(imageView.getContext()).load(url);
        type.asGif()
                .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                .listener(new GlideListener<String, GifDrawable, String>(imageLoadListener, url, imageView))
                .into(imageView);
    }


    /**
     * 释放内存
     *
     * @param context 上下文
     */
    public static void clearMemory(Context context) {
        Glide.get(context).clearMemory();
    }


    /**
     * 取消所有正在下载或等待下载的任务。
     *
     * @param context 上下文
     */
    public static void cancelAllTasks(Context context) {
        LogUtil.e("取消请求");
        Glide.with(context).pauseRequests();
    }

    /**
     * 恢复所有任务
     */
    public static void resumeAllTasks(Context context) {
        Glide.with(context).resumeRequests();
    }

    /**
     * 清除磁盘缓存
     *
     * @param context 上下文
     */
    public static void clearDiskCache(final Context context) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Glide.get(context).clearDiskCache();
            }
        }).start();
    }


    /**
     * 清除所有缓存
     *
     * @param context 上下文
     */
    public static void cleanAll(Context context) {
        clearDiskCache(context);
        clearMemory(context);
    }

}

CircleTransForm.java

package com.minstone.util.Glide;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;

import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;

/**
 * Created by litp on 2016/8/7.
 */
public class CircleTransform extends BitmapTransformation {
    public CircleTransform(Context context) {
        super(context);
    }

    @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return circleCrop(pool, toTransform);
    }

    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 String getId() {
        return getClass().getName();
    }
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KeepStudya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值